私はrandomForestがブラックボックスであることを知っており、ほとんどの人が分類器全体のROC曲線に興味があることを知っていますが、RFの個々のツリーを調べる必要があるという問題に取り組んでいます。私はRに慣れていないので、RFによって生成された個々のツリーのROC曲線をプロットする簡単な方法は何ですか?木のプロット方法RのrandomForestからのROC曲線?
答えて
randomForestパッケージで生成されたランダムなフォレストの1つのツリーからROC曲線を生成することはできません。各ツリーの出力には、トレーニングセットなどの予測からアクセスできます。
# caret for an example data set
library(caret)
library(randomForest)
data(GermanCredit)
# use only 50 rows for demonstration
nrows = 50
# extract the first 9 columns and 50 rows as training data (column 10 is "Class", the target)
x = GermanCredit[1:nrows, 1:9]
y = GermanCredit$Class[1:nrows]
# build the model
rf_model = randomForest(x = x, y = y, ntree = 11)
# Compute the prediction over the training data. Note predict.all = TRUE
rf_pred = predict(rf_model, newdata = x, predict.all = TRUE, type = "prob")
あなたは
rf_pred$individual
で各ツリーの予測にアクセスすることができますしかし、単一のツリーの予測は、最も可能性の高いラベルです。 ROC曲線の場合、クラスの確率が必要です。そのため、決定しきい値を変更すると、予測されるクラスが偽陽性率を変えるようになります。
私が言う限り、少なくともrandomForestのパッケージでは、ラベルの代わりに出力の確率を出力する方法はありません。 getTree()でツリーを調べると、予測はバイナリであることがわかります。 getTree(rf_model、k = 1、labelVar = TRUE)を使用すると、ラベルがプレーンテキストで表示されます。
ただし、predict.all = TRUEで個々の予測を取得してから、フォレスト全体のサブセットでクラスラベルを手動で計算することができます。これで、ROCRパッケージのようなROC曲線を計算する関数に入力することができます。
編集:あなたのコメントにあなたが提供したリンクから、私はROC曲線がどのように得られるかを知っています。まず、特定の1つのツリーを抽出し、ツリー内に各データポイントを入力して、各ノードの成功クラスの出現数と各ノードの合計データポイントをカウントする必要があります。比率は成功クラスのノード確率を与える。次に、同様のことを行います。つまり、各データポイントをツリーに入力しますが、今度は確率を記録します。このようにして、クラスのprobsを真のラベルと比較することができます。 コードは次のとおりです。
# libraries we need
library(randomForest)
library(ROCR)
# Set fixed seed for reproducibility
set.seed(54321)
# Define function to read out output node of a tree for a given data point
travelTree = function(tree, data_row) {
node = 1
while (tree[node, "status"] != -1) {
split_value = data_row[, tree[node, "split var"]]
if (tree[node, "split point"] > split_value) {
node = tree[node, "right daughter"]
} else {
node = tree[node, "left daughter"]
}
}
return(node)
}
# define number of data rows
nrows = 100
ntree = 11
# load example data
data(GermanCredit)
# Easier access of variables
x = GermanCredit[1:nrows, 1:9]
y = GermanCredit$Class[1:nrows]
# Build RF model
rf_model = randomForest(x = x, y = y, ntree = ntree, nodesize = 10)
# Extract single tree and add variables we need to compute class probs
single_tree = getTree(rf_model, k = 2, labelVar = TRUE)
single_tree$"split var" = as.character(single_tree$"split var")
single_tree$sum_good = 0
single_tree$sum = 0
single_tree$pred_prob = 0
for (zeile in 1:nrow(x)) {
out_node = travelTree(single_tree, x[zeile, ])
single_tree$sum_good[out_node] = single_tree$sum_good[out_node] + (y[zeile] == "Good")
single_tree$sum[out_node] = single_tree$sum[out_node] + 1
}
# Compute class probabilities from count of "Good" data points in each node.
# Make sure we do not divide by zero
idcs = single_tree$sum != 0
single_tree$pred_prob[idcs] = single_tree$sum_good[idcs]/ single_tree$sum[idcs]
# Compute prediction by inserting again data set into tree, but read out
# previously computed probs
single_tree_pred = rep(0, nrow(x))
for (zeile in 1:nrow(x)) {
out_node = travelTree(single_tree, x[zeile, ])
single_tree_pred[zeile] = single_tree$pred_prob[out_node]
}
# Et voila: The ROC curve for single tree!
plot(performance(prediction(single_tree_pred, y), "tpr", "fpr"))
これは理にかなっています!私はJavaScriptを使ってツリーを読んで、ツリー全体のデータセットを実行し、[ここ](http://stats.stackexchange.com/questions/105760/how-we-can-draw-an-決定ツリーのための曲線曲線110500#110500?newreg = 9ca13b7b43bf4985b9e75a5cc1cb2ae6)。 マルチクラスの分類の場合、葉の真の予測として何が重要かは分かりません。あなたが言ったように最も可能性の高いラベルを使用しますか?この葉の中の他のものはすべて偽と見なされますか?ツリーの葉にスコアを集めるにはどうすればよいですか? ありがとうございます。 – MaYa
私はgetTreeによって与えられた木構造を使ってデータのラベルを手動で計算することについて考えていません。私はrandomForestパッケージにそのための関数があるとは思わないが、実際にはprobを計算することは可能です。 私はマルチクラスの分類に経験がありません。もし押されれば、私は1対すべての分類を行います。 ROC曲線の文脈では、マルチクラスは意味をなさない。すみません、私はあなたにそれ以上のことをお手伝いできません。 – Calbers
あなたがまだ聞いている(おそらくは関連性はないかもしれませんが、完全性のために)ランダムなフォレストの1つのツリーからROC曲線を計算するためのコードを追加しました。楽しむ! – Calbers
- 1. randomForestからの分類のROC曲線
- 2. プロット曲線ROC em R
- 3. BinaryClassificationMetricsからROC曲線と精度リコール曲線をプロットする方法
- 4. 複数のROC曲線をプロットする
- 5. Tensorflowとscikit-learnでROC曲線をプロットする方法は?
- 6. ROC曲線tf.contrib.learn.LinearClassifier
- 7. ROC曲線Turuch
- 8. Rの曲線の漸近線をプロットする方法は?
- 9. matplotlibのROC/AUC曲線
- 10. RはAUCを取得し、同時に複数のROC曲線をプロットする
- 11. 1つのプロット内の複数のROC曲線ROCR
- 12. ROC曲線をプロットするためのlibsvm
- 13. ROCを用いた線形判別分析のRoc曲線
- 14. Rの正弦曲線をプロットする
- 15. Python、Roc曲線とggplot?
- 16. ROCRパッケージを使用したRのROC曲線
- 17. ROC曲線からのしきい値の取得
- 18. 分類またはクラスタリングの結果からのROC曲線
- 19. Rからベジェ曲線をエクスポートする? Rの正弦曲線をプロットし、PDFとして出力を保存
- 20. Rで学習曲線をプロットする方法は?
- 21. R - 集計ポイントとロジスティック曲線プロット
- 22. Rログのプロットで曲線をプロットする
- 23. scikit-learnを使用してバイナリ値のスコアのROC曲線をプロットする方法は?
- 24. ROC曲線を使用した評価
- 25. シークレットのROC曲線の予測配列は何ですか
- 26. ggplotの濃度曲線プロット
- 27. 同じグラフの複数の曲線をプロットするR
- 28. Rで、非線形曲線をプロットする
- 29. Rグラフの曲線のエッジ
- 30. 混乱行列の値を使ってROC曲線を描く方法は?
フォレストに1000頭のタルトがある場合、それを視覚化することは意味がありません。 –
真。私は可視化する木のサブセットを選択しています。 – MaYa
あなたの意図を得るためにいくつかのコードを入力してください。 –