最初の(そして最も簡単な)ソリューション: Andy Liaw's randomForest
で実装されているように、従来のRFに固執したくない場合は、元のRF ™アルゴリズムの異なる実装を提供するパーティーパッケージを試すことができます単位重量平均で)。次に、このR-help投稿で報告されているように、ツリーのリストの単一のメンバーをプロットできます。私の知る限り、スムーズに実行されているようです。以下は、によって生成された1つのツリーのプロットです。cforest(Species ~ ., data=iris, controls=cforest_control(mtry=2, mincriterion=0))
第二に、(ほとんどのように簡単に)解決策: Rのツリーベースの技術のほとんどは(tree
、rpart
、TWIX
、など)を提供していますtree
単一のツリーをプロット/印刷用の様な構造を。アイデアはrandomForest::getTree
、統計的な観点から無意味である場合でも、出力をそのようなRオブジェクトに変換することです。基本的に、tree
以下に示すように、オブジェクトからツリー構造に簡単にアクセスできます。タスクのタイプ(回帰と分類)によってわずかに異なることに注意してください。後者の場合、クラス固有の確率はobj$frame
(の最後の列)として追加されます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()
そのために使用できますが、正直なところ、これが正しい方法であるかどうかはわかりません。
3番目の(そして確かに賢い)ソリューション:as.tree
上記の「パッチ」のすべてを軽減する真のヘルパー関数を作成します。次に、Rのプロット方法を使用するか、おそらくより良い方法として、(Rから直接)Klimtを使用して個々のツリーを表示できます。