在出版物中展示随机森林的最佳方式?

机器算法验证 r 机器学习 分类 随机森林 微阵列
2022-01-30 00:06:45

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

  • 呈现随机森林的最佳方式是什么,以便有足够的信息使其在论文中可重现?
  • 如果特征数量很少,R 中是否有实际绘制树的绘图方法?
  • 错误率的 OOB 估计值是引用的最佳统计数据吗?
3个回答

关于使其可重现,最好的方法是在论文中提供可重现的研究(即代码和数据)。使其在您的网站或托管网站(如 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)

Strobl/Zeileis 关于“为什么以及如何使用随机森林变量重要性度量(以及你不应该如何)”的演示文稿中包含必须以这种方式生成的树的示例。这篇关于树模型的博客文章有一些不错的 CART 树图示例,您可以使用这些示例。

正如@chl 评论的那样,在这种情况下,一棵树并不是特别有意义,所以没有用它来解释什么是随机森林,我不会将它包含在论文中。

  1. 正如Shane所写;使其具有可重复性的研究 + 包括随机种子,因为 RF 是随机的。
  2. 首先,绘制单棵树形成RF是无稽之谈;这是一个集成分类器,它仅作为一个整体才有意义。但即使绘制整个森林也是无稽之谈——它是一个黑盒分类器,所以它不是为了解释数据的结构,而是为了复制原始过程。取而代之的是,制作一些 Shane 建议的情节。
  3. 在实践中,OOB 是一种非常好的误差近似;然而这并不是一个被广泛接受的事实,所以为了发表,最好也制作一份简历来确认它。

请记住其他答案中关于情节必然有意义的警告。但是,如果您想要一个用于说明/教学目的的绘图,那么下面的 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))