我知道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
请提供一些代码,以便我们获得您的意图。 –