在出版物中呈现随机森林的最佳方法?


75

我正在使用随机森林算法作为具有1000多个特征的微阵列研究中两组的鲁棒分类器。

  • 呈现随机森林的最佳方法是什么,以便有足够的信息使其在纸上可重现?
  • 如果要素数量少,R中是否有绘制方法实际绘制树?
  • OOB错误率估计是否是引用的最佳统计数据?

2
没有一棵树...但是请参阅@Shane的回应,出于说明目的绘制其中一棵。
chl 2010年

我当然值得考虑randomForest :: partialPlot,stats.stackexchange.com
Soren Havelund Welling

1
您可以尝试使用我的随机森林可视化程序包forestFloor-forestfloor.dk
Soren Havelund Welling

Answers:


48

关于使其具有可复制性,最好的方法是与论文一起提供可复制的研究(即代码和数据)。使它在您的网站或托管网站(例如github)上可用。

关于可视化,Leo Breiman为此做了一些有趣的工作(请参阅他的主页,特别是图形部分)。

但是,如果您使用的是R,则该randomForest软件包具有一些有用的功能:

data(mtcars)
mtcars.rf <- randomForest(mpg ~ ., data=mtcars, ntree=1000, keep.forest=FALSE,
                           importance=TRUE)
plot(mtcars.rf, log="y")
varImpPlot(mtcars.rf)

set.seed(1)
data(iris)
iris.rf <- randomForest(Species ~ ., iris, proximity=TRUE,
                        keep.forest=FALSE)
MDSplot(iris.rf, iris$Species)

我不知道实际绘制树的简单方法,但是您可以使用该getTree函数检索树并将其单独绘制。

getTree(randomForest(iris[,-5], iris[,5], ntree=10), 3, labelVar=TRUE)

上施特罗布尔/ Zeileis呈现“为什么以及如何使用随机森林变量重要性措施(以及如何你不应该)”有哪些必须以这种方式产生的树木的例子。这篇关于树模型的博客文章提供了一些不错的CART树图示例,您可以使用这些示例。

正如@chl所评论的,在这种情况下,单棵树并不是特别有意义,因此,由于没有使用它来解释什么是随机森林,因此我不会在论文中提及。


4
关于图的小扩展:plot.randomForest显示了随着树数量的增加,OOB错误和类内OOB错误如何演变;varImpPlot显示了用于顶级属性的属性重要性度量以及MDSplot在RF对象接近度度量的2D投影上绘制的所有对象。

+1表示MDSplot()功能。我必须承认,我经常将RF用作突出个人集群的一种方法(基于RF邻近度度量),而不是选择最佳功能。与var的点状图相比,临床医生通常更容易读取此类图。重要性...
chl

18
  1. 如谢恩所写;使其可重现研究+包括随机种子,因为RF是随机的。
  2. 首先,绘制构成RF的单棵树是胡说八道;这是一个整体分类器,仅在整体上有意义。但是,即使绘制整个森林也是胡说八道-它是一个黑盒分类器,因此,它并不是要用其结构解释数据,而是要复制原始过程。相反,请做出Shane建议的一些图。
  3. 实际上,OOB是一个非常好的误差近似值。但这并不是一个广为接受的事实,因此,对于出版物来说,最好还制作一份简历以确认这一事实。

因此,@ mbq在执行CV时首先对所有选定的样本进行随机森林是有效的;全部执行两次,其次执行前10个变量(可以在论文中引用)。然后进行留一法交叉验证(每次尝试选择10个最重要的基因)并从中引用CV错误吗?
danielsbrewer'9

1
@danielsbrewer我会以其他方式执行此操作(更多地关注功能选择),但这是正确的;然而,与其说是针对生物学问题选择最佳标记,不如说是对RF功能选择进行基准测试的主题。

2
主要问题在于,很难比较两个模型(模型=学习方法+功能选择方法),但为简单起见,您可以假设一些内容(例如我将使用RF并选择前10个属性)并承认您知道这可能不是最理想的,但是您同意,例如您对准确性感到满意。在那种情况下,您唯一的问题是消除属性选择的偏差。待定。

2
因此,我将做一个简单的装袋:您创建10个对象(如果有一台好的计算机,则为30个)对象的随机子样本(比方说,通过随机替换进行替换),对每个对象进行RF训练,确定其重要性并返回每个对象的等级属性在所有重复中平均(最佳属性的排名为1,次优2,依此类推;可以对其进行平均,以使1st的12倍和2nd的18倍的属性具有1.6的排名),最后选择10个具有最佳排名的属性并将其称为您的标记。然后使用CV(LOO,10倍或最好是随机抽样)来使用您的标记获得RF的误差近似值。待定。

2
报告等级(希望它们应该接近1,2,3 ...),CV误差及其偏差(仅计算每个CV回合结果的标准偏差)和OOB误差(可能与CV误差相同)。免责声明:这不是选择最佳数量的属性的方法-您需要RFE和嵌套的CV才能做到这一点。免责声明2:我尚未处理过此类数据,因此,我不保证您的裁判会对此感到满意(尽管我相信他们会)。

13

请记住,关于该情节的其他答案中的警告必定是有意义的。但是,如果您希望出于说明/教学目的使用图表,则以下R片段可能会有用。如果需要,可以在边缘文本上添加“分割点”。

to.dendrogram <- function(dfrep,rownum=1,height.increment=0.1){

  if(dfrep[rownum,'status'] == -1){
    rval <- list()

    attr(rval,"members") <- 1
    attr(rval,"height") <- 0.0
    attr(rval,"label") <- dfrep[rownum,'prediction']
    attr(rval,"leaf") <- TRUE

  }else{##note the change "to.dendrogram" and not "to.dendogram"
    left <- to.dendrogram(dfrep,dfrep[rownum,'left daughter'],height.increment)
    right <- to.dendrogram(dfrep,dfrep[rownum,'right daughter'],height.increment)
    rval <- list(left,right)

    attr(rval,"members") <- attr(left,"members") + attr(right,"members")
    attr(rval,"height") <- max(attr(left,"height"),attr(right,"height")) + height.increment
    attr(rval,"leaf") <- FALSE
    attr(rval,"edgetext") <- dfrep[rownum,'split var']
    #To add Split Point in Dendrogram
    #attr(rval,"edgetext") <- paste(dfrep[rownum,'split var'],"\n<",round(dfrep[rownum,'split point'], digits = 2),"=>", sep = " ")
  }

  class(rval) <- "dendrogram"

  return(rval)
}

mod <- randomForest(Species ~ .,data=iris)
tree <- getTree(mod,1,labelVar=TRUE)

d <- to.dendrogram(tree)
str(d)
plot(d,center=TRUE,leaflab='none',edgePar=list(t.cex=1,p.col=NA,p.lty=0))

1
该代码产生了非常好的树图。但是没有显示这些值。可能需要在last(plot)语句之后添加text()函数。
rnso 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.