1000 개의 기능을 갖춘 마이크로 어레이 연구에서 랜덤 포레스트 알고리즘을 두 그룹의 강력한 분류 자로 사용하고 있습니다.
- 논문에서 재현 할 수 있도록 충분한 정보가있을 수 있도록 임의의 숲을 제시하는 가장 좋은 방법은 무엇입니까?
- 피처 수가 적을 경우 실제로 트리를 그리는 플롯 방법이 있습니까?
- 오류율의 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이 언급했듯이, 단일 트리는이 맥락에서 특별히 의미가 없으므로 임의의 숲이 무엇인지 설명하기 위해 나무를 사용하지 않기 때문에 종이에 포함시키지 않을 것입니다.
plot.randomForest
트리 수가 증가함에 따라 OOB 오류 및 클래스 내 OOB 오류가 어떻게 발전했는지 보여줍니다. RF 객체 근접 측정의 2D 투영에 플롯 된 varImpPlot
최상위 속성 및 MDSplot
모든 객체에 대한 속성 중요도 측정 값을 보여줍니다 .
MDSplot()
기능 인용으로 +1 최고의 기능을 선택하는 대신 RF 근접 측정을 기반으로 개인 클러스터를 강조하는 방법으로 RF를 자주 사용한다는 점을 인정해야합니다. 임상의는 종종 var의 dotplot보다 훨씬 쉽게 그러한 음모를 읽습니다. 중요성 ...
음모에 대한 다른 답변의 경고는 반드시 의미가 있음을 명심하십시오. 그러나 설명 / 교육 목적을위한 음모를 원한다면 다음 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))