ツリーから生成された1つのルールをプログラムでテストしたいと思います。ツリーでは、ルートとリーフ(ターミナルノード)の間のパスは、原則として解釈できます。
Rでは、rpart
パッケージを使用して次のことを行うことができます:(この投稿ではiris
、例としてのみデータセットを使用します)
library(rpart)
model <- rpart(Species ~ ., data=iris)
この2行model
で、クラスがrpart.object
(rpart
ドキュメント、21ページ)であるという名前のツリーを取得しました。このオブジェクトには多くの情報があり、さまざまなメソッドをサポートしています。特に、オブジェクトにはframe
変数(標準的な方法でアクセスできます: model$frame
)(idem)とメソッドpath.rpath
(rpart
ドキュメント、7ページ)があり、ルートノードから目的のノードへのパスを提供しますnode
(働き)
変数のrow.names
にframe
は、ツリーのノード番号が含まれています。このvar
列には、ノード内の分割変数、yval
近似値とyval2
クラス確率、およびその他の情報が表示されます。
> model$frame
var n wt dev yval complexity ncompete nsurrogate yval2.1 yval2.2 yval2.3 yval2.4 yval2.5 yval2.6 yval2.7
1 Petal.Length 150 150 100 1 0.50 3 3 1.00000000 50.00000000 50.00000000 50.00000000 0.33333333 0.33333333 0.33333333
2 <leaf> 50 50 0 1 0.01 0 0 1.00000000 50.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000
3 Petal.Width 100 100 50 2 0.44 3 3 2.00000000 0.00000000 50.00000000 50.00000000 0.00000000 0.50000000 0.50000000
6 <leaf> 54 54 5 2 0.00 0 0 2.00000000 0.00000000 49.00000000 5.00000000 0.00000000 0.90740741 0.09259259
7 <leaf> 46 46 1 3 0.01 0 0 3.00000000 0.00000000 1.00000000 45.00000000 0.00000000 0.02173913 0.97826087
ただし<leaf>
、var
列でマークされているのはターミナルノード(リーフ)のみです。この場合、ノードは2、6、および7です。
上記のようにpath.rpart
、ルールを抽出する方法を使用できます(この手法は、 rattle
パッケージおよびSharmaクレジットスコアの記事で次のように使用されます。
さらに、モデルは予測値の値を
predicted.levels <- attr(model, "ylevels")
yval
この値は、model$frame
データセットの列に対応しています。
ノード番号7(行番号5)のリーフの場合、予測値は次のようになります。
> ylevels[model$frame[5, ]$yval]
[1] "virginica"
ルールは
> rule <- path.rpart(model, nodes = 7)
node number: 7
root
Petal.Length>=2.45
Petal.Width>=1.75
したがって、ルールは次のように読み取ることができます
If Petal.Length >= 2.45 AND Petal.Width >= 1.75 THEN Species = Virginica
このルールに対して真陽性がいくつあるかをテストできることを知っています(テストデータセットでは、アイリスデータセットを再度使用します)。新しいデータセットを次のようにサブセット化します。
> hits <- subset(iris, Petal.Length >= 2.45 & Petal.Width >= 1.75)
次に混同行列を計算します
> table(hits$Species, hits$Species == "virginica")
FALSE TRUE
setosa 0 0
versicolor 1 0
virginica 0 45
(注:テストと同じアイリスデータセットを使用しました)
プログラムでルールを評価するにはどうすればよいですか?次のようにルールから条件を抽出できます
> unlist(rule, use.names = FALSE)[-1]
[1] "Petal.Length>=2.45" "Petal.Width>=1.75"
しかし、どうすればここから続けることができますか?subset
機能が使えない
前もって感謝します
注: この質問は、わかりやすくするために大幅に編集されています