我知道randomForest應該是一個黑盒子,而且大多數人都對整個分類器的ROC曲線感興趣,但是我正在研究一個需要檢查RF單個樹的問題。我對R並不是很有經驗,因此繪製RF生成的單個樹的ROC曲線的簡單方法是什麼?如何繪製R樹隨機樹的ROC曲線?
回答
我不認爲你可以從randomForest包生成的隨機森林中的單個樹生成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曲線,如ROCR軟件包中的曲線。
編輯:好的,從您在評論中提供的鏈接中獲得瞭如何獲得ROC曲線的想法。首先,我們需要提取一棵特定的樹,然後將每個數據點輸入到樹中,以便計算每個節點上成功類的發生次數以及每個節點中的總數據點。該比率給出了成功等級的節點概率。接下來,我們做類似的事情,即將每個數據點輸入到樹中,但現在記錄概率。這樣我們可以比較類的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中讀取樹並通過將整個數據集運行到樹上並計算分數來計算葉節點概率,例如[here](http://stats.stackexchange.com/questions/105760/how-we-can-draw-an- ROC曲線換決策樹/ 110500#110500?newreg = 9ca13b7b43bf4985b9e75a5cc1cb2ae6)。 雖然在多類分類的情況下,我不確定在葉子中真正的預測是什麼。如你所說,我是否使用最可能的標籤?這片葉子裏的其他一切都算錯了?以及如何彙總樹葉上的分數? 非常感謝。 – MaYa
我還沒有想過使用getTree給出的樹結構來手動計算數據上的標籤。我不認爲在randomForest包中有一個函數,但它實際上可以計算出probs。 我沒有多班分類的經驗;如果按下,我會做一對一的分類。在ROC曲線的背景下,多類也沒有任何意義。對不起,我無法幫助你。 – Calbers
如果您仍在監聽(可能不再相關,但爲了完整起見),我添加了代碼以便從隨機森林的單個樹中計算ROC曲線。玩的開心! – Calbers
- 1. 繪圖曲線ROC em R
- 2. Ntlk&Python,繪製ROC曲線
- 3. 瞭解如何繪製ROC曲線
- 4. 如何繪製下列曲線的ROC曲線?
- 5. 如何在計算機視覺算法中繪製ROC曲線?
- 6. 如何獲得決策樹的ROC曲線?
- 7. 用於繪製ROC曲線的libsvm
- 8. 在Python中繪製ROC曲線
- 9. 如何ROC曲線
- 10. 如何繪製R中的CostSensitiveClassifier樹?
- 11. R獲得AUC並同時繪製多個ROC曲線
- 12. 使用rocr包的決策樹的ROC曲線
- 13. 如何繪製來自BinaryClassificationMetrics的ROC曲線和精度 - 召回曲線
- 14. 如何使用混淆矩陣的值繪製ROC曲線?
- 15. 如何繪製一個coxmodel(存活出現分析)ROC曲線
- 16. 如何用Tensorflow和scikit-learn繪製ROC曲線?
- 17. Weka如何從KNN(IBk)中繪製ROC曲線?
- 18. 構建R中的ROC曲線
- 19. R中多類分類的ROC曲線
- 20. 用r在r上繪製決策樹
- 21. ROC曲線tf.contrib.learn.LinearClassifier
- 22. ROC曲線Turorial
- 23. 如何繪製連接的隨機線?
- 24. d3強制定向樹上的曲線
- 25. 隨機樹(遞歸)
- 26. 創建隨機樹?
- 27. 隨機繪製500棵樹中的一棵林林包
- 28. 使用perfcurve繪製神經網絡分類器的ROC曲線
- 29. 用ggplot2繪製多個ROC曲線在不同的層
- 30. 在R(插圖)中繪製決策樹
如果你的森林有1000髮束,然後想象它們沒有意義。 –
是的。我正在選擇樹的一個子集來可視化。 – MaYa
請提供一些代碼,以便我們獲得您的意圖。 –