我在具有 1000 个特征的微阵列研究中使用随机森林算法作为两组的稳健分类器。
- 呈现随机森林的最佳方式是什么,以便有足够的信息使其在论文中可重现?
- 如果特征数量很少,R 中是否有实际绘制树的绘图方法?
- 错误率的 OOB 估计值是引用的最佳统计数据吗?
我在具有 1000 个特征的微阵列研究中使用随机森林算法作为两组的稳健分类器。
关于使其可重现,最好的方法是在论文中提供可重现的研究(即代码和数据)。使其在您的网站或托管网站(如 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 评论的那样,在这种情况下,一棵树并不是特别有意义,所以没有用它来解释什么是随机森林,我不会将它包含在论文中。
请记住其他答案中关于情节必然有意义的警告。但是,如果您想要一个用于说明/教学目的的绘图,那么下面的 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))