간행물에 임의의 포리스트를 표시하는 가장 좋은 방법은 무엇입니까?


75

1000 개의 기능을 갖춘 마이크로 어레이 연구에서 랜덤 포레스트 알고리즘을 두 그룹의 강력한 분류 자로 사용하고 있습니다.

  • 논문에서 재현 할 수 있도록 충분한 정보가있을 수 있도록 임의의 숲을 제시하는 가장 좋은 방법은 무엇입니까?
  • 피처 수가 적을 경우 실제로 트리를 그리는 플롯 방법이 있습니까?
  • 오류율의 OOB 추정치는 인용하기 가장 좋은 통계입니까?

2
단일 트리가 없습니다 ... 그러나 설명을 위해 그 중 하나를 표시하는 @Shane의 응답을 참조하십시오.
chl

나는 확실히 가치가 랜덤 포레스트 :: partialPlot, 고려 stats.stackexchange.com/questions/92150/...
소렌 Havelund 솟아

1
내 임의의 포리스트 시각화 패키지 forestFloor-forestfloor.dk
Soren Havelund Welling

답변:


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)

"임의의 산림 가변 중요도 측정 방법을 사용하는 이유와 방법 (및 사용하지 말아야 할 방법)"에 대한 Strobl / Zeileis 프레젠테이션 에는 이러한 방식으로 생성 된 나무의 예가 있습니다. 이 트리 모델에 대한블로그 게시물 에는 예를 들어 사용할 수있는 CART 트리 도표의 멋진 예가 있습니다.

@chl이 언급했듯이, 단일 트리는이 맥락에서 특별히 의미가 없으므로 임의의 숲이 무엇인지 설명하기 위해 나무를 사용하지 않기 때문에 종이에 포함시키지 않을 것입니다.


4
플롯에 대한 작은 확장 : plot.randomForest트리 수가 증가함에 따라 OOB 오류 및 클래스 내 OOB 오류가 어떻게 발전했는지 보여줍니다. RF 객체 근접 측정의 2D 투영에 플롯 된 varImpPlot최상위 속성 및 MDSplot모든 객체에 대한 속성 중요도 측정 값을 보여줍니다 .

MDSplot()기능 인용으로 +1 최고의 기능을 선택하는 대신 RF 근접 측정을 기반으로 개인 클러스터를 강조하는 방법으로 RF를 자주 사용한다는 점을 인정해야합니다. 임상의는 종종 var의 dotplot보다 훨씬 쉽게 그러한 음모를 읽습니다. 중요성 ...
chl

18
  1. 셰인이 쓴대로; RF는 확률론 적이므로 재현 가능한 연구를하고 + 랜덤 시드를 포함시킵니다.
  2. 우선, RF를 형성하는 단일 트리를 플로팅하는 것은 말이되지 않습니다. 이것은 앙상블 분류기이며 전체적으로 만 의미가 있습니다. 그러나 전체 포리스트를 플로팅하는 것조차 의미가 없습니다. 블랙 박스 분류기이므로 데이터를 구조로 설명하는 것이 아니라 원래 프로세스를 복제하기위한 것입니다. 대신 셰인이 제안한 음모를 만들어보십시오.
  3. 실제로 OOB는 매우 좋은 오류 근사치입니다. 그러나 이것은 널리 받아 들여지는 사실이 아니기 때문에 출판을 위해 CV를 만들어 확인하는 것이 좋습니다.

따라서 CV를 수행 할 때 @mbq는 모든 샘플이 선택된 임의의 포리스트를 먼저 수행하는 것이 유효합니다. 상위 10 개의 변수 (종이에 인용 할 수 있음)로 두 번 모두 수행하십시오. 그런 다음 leave-one out 교차 검증을 수행하고 (각 10 개의 최상위 유전자를 선택) 그로부터 CV 오류를 인용합니까?
danielsbrewer

1
@danielsbrewer 다른 방법으로 (기능 선택에 더 많은주의를 기울임)이 작업을 수행하지만 이것이 맞습니다. 그러나 생물학적 문제에 가장 적합한 마커를 선택하는 것보다 RF 기능 선택을 벤치마킹하는 주제에 더 중점을두고 있습니다.

2
주요 문제는 두 가지 모델 (모델 = 학습 방법 + 기능 선택 방법)을 비교하는 것이 실제로 어렵다는 점이지만, 단순화하기 위해 RF를 사용하고 상위 10 개 속성을 선택하는 것과 같이 무언가를 가정하고 알 수 있음을 인정할 수 있습니다 이는 차선책 일 수 있지만, 예를 들어 정확성에 만족하는 동안 이에 동의합니다. 이 경우 유일한 문제는 속성 선택의 바이어스를 제거하는 것입니다. tbc.

2
그래서 간단한 포장을 할 것입니다 : 당신은 10 (또는 좋은 컴퓨터를 가지고 있다면 30 개) 객체의 임의의 하위 샘플을 생성하고 (교체로 무작위 선택으로 말합시다) 각각에 대해 RF를 훈련시키고 중요성을 얻고 각 등급을 반환합니다 속성은 모든 반복에 대해 평균화되었습니다 (최고의 속성은 1 위, 2 위는 2 위, 기타는 12 배, 2 위는 12 배였던 평균은 1.6의 순위를 가짐). 최종 순위로 10을 선택하고 호출하십시오. 당신의 마커. 그런 다음 CV (LOO, 10 배 또는 무작위 샘플링)를 사용하여 마커를 사용하여 RF의 오차 근사값을 구하십시오. tbc.

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
이 코드는 매우 좋은 트리 플롯을 생성합니다. 그러나 값이 표시되지 않습니다. 아마도 마지막 (플롯) 문 다음에 text () 함수를 추가해야 할 것입니다.
rnso
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.