첫 번째 (가장 쉬운) 솔루션 : Andy Liaw 's에서 구현 한 것처럼 고전 RF를 고수하지 않으 려면 원래 RF ™ 알고리즘 의 다른 구현 (조건부 트리 및 집계 체계 사용) 을 제공하는 파티 패키지를 randomForest
사용해 볼 수 있습니다 단위 중량 평균). 그런 다음이 R-help post 에보고 된대로 트리 목록의 단일 멤버를 플롯 할 수 있습니다. 내가 알 수있는 한 원활하게 실행되는 것 같습니다. 아래는에 의해 생성 된 하나의 트리의 도표입니다 .cforest(Species ~ ., data=iris, controls=cforest_control(mtry=2, mincriterion=0))
두 번째 (거의 쉽게) 솔루션 : R 트리 기반 기술의 대부분 ( tree
, rpart
, TWIX
, 등)를 제공하는 tree
하나의 트리를 세우고 / 인쇄 -like 구조를. 아이디어는 randomForest::getTree
통계적 관점에서 무의미한 경우에도 출력 을 그러한 R 객체 로 변환하는 것입니다. 기본적으로 tree
아래와 같이 객체 에서 트리 구조에 쉽게 액세스 할 수 있습니다. 회귀를 분류 대 - - 후자의 경우에이의 마지막 컬럼으로 클래스 고유의 확률을 추가 할 것입니다 곳이 약간 작업의 종류의 따라 다를 수 있음을 유의하시기 바랍니다 obj$frame
(A이다 data.frame
).
> library(tree)
> tr <- tree(Species ~ ., data=iris)
> tr
node), split, n, deviance, yval, (yprob)
* denotes terminal node
1) root 150 329.600 setosa ( 0.33333 0.33333 0.33333 )
2) Petal.Length < 2.45 50 0.000 setosa ( 1.00000 0.00000 0.00000 ) *
3) Petal.Length > 2.45 100 138.600 versicolor ( 0.00000 0.50000 0.50000 )
6) Petal.Width < 1.75 54 33.320 versicolor ( 0.00000 0.90741 0.09259 )
12) Petal.Length < 4.95 48 9.721 versicolor ( 0.00000 0.97917 0.02083 )
24) Sepal.Length < 5.15 5 5.004 versicolor ( 0.00000 0.80000 0.20000 ) *
25) Sepal.Length > 5.15 43 0.000 versicolor ( 0.00000 1.00000 0.00000 ) *
13) Petal.Length > 4.95 6 7.638 virginica ( 0.00000 0.33333 0.66667 ) *
7) Petal.Width > 1.75 46 9.635 virginica ( 0.00000 0.02174 0.97826 )
14) Petal.Length < 4.95 6 5.407 virginica ( 0.00000 0.16667 0.83333 ) *
15) Petal.Length > 4.95 40 0.000 virginica ( 0.00000 0.00000 1.00000 ) *
> tr$frame
var n dev yval splits.cutleft splits.cutright yprob.setosa yprob.versicolor yprob.virginica
1 Petal.Length 150 329.583687 setosa <2.45 >2.45 0.33333333 0.33333333 0.33333333
2 <leaf> 50 0.000000 setosa 1.00000000 0.00000000 0.00000000
3 Petal.Width 100 138.629436 versicolor <1.75 >1.75 0.00000000 0.50000000 0.50000000
6 Petal.Length 54 33.317509 versicolor <4.95 >4.95 0.00000000 0.90740741 0.09259259
12 Sepal.Length 48 9.721422 versicolor <5.15 >5.15 0.00000000 0.97916667 0.02083333
24 <leaf> 5 5.004024 versicolor 0.00000000 0.80000000 0.20000000
25 <leaf> 43 0.000000 versicolor 0.00000000 1.00000000 0.00000000
13 <leaf> 6 7.638170 virginica 0.00000000 0.33333333 0.66666667
7 Petal.Length 46 9.635384 virginica <4.95 >4.95 0.00000000 0.02173913 0.97826087
14 <leaf> 6 5.406735 virginica 0.00000000 0.16666667 0.83333333
15 <leaf> 40 0.000000 virginica 0.00000000 0.00000000 1.00000000
그런 다음 해당 객체를 예쁘게 인쇄하고 플로팅하는 방법이 있습니다. 주요 기능은 (그래픽 표시) 및 (계산 노드 좌표)에 의존 하는 일반적인 tree:::plot.tree
방법입니다 (트리플 :
을 R로 직접 볼 수 있도록 트리플 을 넣습니다 ). 이 함수들은 트리 의 표현을 기대합니다 . 다른 미묘한 문제 : (1) 기본 플로팅 방법 의 논점 은 노드 사이의 수직 거리를 관리하는 데 도움이됩니다 ( 이탈에 비례 한다는 것을 의미하며 고정됨을 의미합니다). (2) 노드와 스플릿에 텍스트 레이블을 추가 하기위한 호출 로 보완해야합니다 .이 경우에는을 (를) 살펴 봐야 합니다.tree:::treepl
tree:::treeco
obj$frame
type = c("proportional", "uniform")
tree:::plot.tree
proportional
uniform
plot(tr)
text(tr)
tree:::text.tree
getTree
에서 방법 randomForest
수익률 온라인 도움말에 설명되어 다른 구조. 터미널 노드와 함께 status
코드 (-1)로 표시되는 일반적인 출력이 아래에 나와 있습니다 . (역시, 출력 만 온, 작업의 종류에 따라 다르고, status
그리고 prediction
열).
> library(randomForest)
> rf <- randomForest(Species ~ ., data=iris)
> getTree(rf, 1, labelVar=TRUE)
left daughter right daughter split var split point status prediction
1 2 3 Petal.Length 4.75 1 <NA>
2 4 5 Sepal.Length 5.45 1 <NA>
3 6 7 Sepal.Width 3.15 1 <NA>
4 8 9 Petal.Width 0.80 1 <NA>
5 10 11 Sepal.Width 3.60 1 <NA>
6 0 0 <NA> 0.00 -1 virginica
7 12 13 Petal.Width 1.90 1 <NA>
8 0 0 <NA> 0.00 -1 setosa
9 14 15 Petal.Width 1.55 1 <NA>
10 0 0 <NA> 0.00 -1 versicolor
11 0 0 <NA> 0.00 -1 setosa
12 16 17 Petal.Length 5.40 1 <NA>
13 0 0 <NA> 0.00 -1 virginica
14 0 0 <NA> 0.00 -1 versicolor
15 0 0 <NA> 0.00 -1 virginica
16 0 0 <NA> 0.00 -1 versicolor
17 0 0 <NA> 0.00 -1 virginica
당신은에 의해 생성 된 하나에 위의 표를 변환 관리 할 수 있다면 tree
, 당신은 아마 사용자 정의 할 수 있습니다 tree:::treepl
, tree:::treeco
그리고 tree:::text.tree
나는이 방법의 예를하지 않아도 불구하고, 사용자의 요구에 맞게. 특히 RF에서 의미가없는 이탈도, 클래스 확률 등을 제거하고 싶을 것입니다. 노드 좌표를 설정하고 값을 분할하기 만하면됩니다. 당신은 fixInNamespace()
그것을 사용할 수 있지만, 솔직히 말해서 이것이 올바른 길인지 확신 할 수 없습니다.
셋째 (그리고 확실히 영리한) 해결책 :as.tree
위의 모든 "패치"를 완화시키는 진정한 도우미 기능을 작성하십시오 . 그런 다음 R의 플로팅 방법을 사용하거나 Klimt (R에서 직접)를 사용하여 개별 트리를 표시 할 수 있습니다.