通常我们不能为像决策树这样的离散分类器绘制 ROC 曲线。我对吗?有没有办法为 Dtrees 绘制 ROC 曲线?
我们如何绘制决策树的 ROC 曲线?
机器算法验证
鹏
大车
2022-02-16 01:43:51
2个回答
如果您的分类器仅产生因子结果(仅标签),没有分数,您仍然可以绘制 ROC 曲线。然而,这条 ROC 曲线只是一个点。考虑到 ROC 空间,这个点是,其中 - 假阳性率和 - 真阳性率。
在Wikipedia 页面上查看有关如何计算的更多信息。
您可以通过绘制一条从到您的点并从那里到的线来将此点扩展为看起来像 ROC 曲线。因此,您有一条曲线。
但是,决策树很容易从标签输出扩展到数字输出。请注意,当您使用决策树进行预测时,您会从根节点向下到叶节点,在那里您使用多数类进行预测。如果您不返回该类,而是返回该叶节点中类的比例,那么您将获得每个类的分数。假设您有两个类和,并且在您的叶节点中,您有 10 个带有的实例和 5 个带有的实例,您可以返回一个分数向量:. 请注意,这确实是一个正确的评分规则(这不是概率的最佳估计值),但我相信总比没有好,这就是通常为决策树检索分数的方式。
对于决策树,仍以一定程度的确定性预测类别。@rapaio 已经给出了答案,但我会稍微扩展一下。
想象一下下面的决策树(这是一个稍微修改过的版本)
在每个节点上,不仅有多数类标签,还有其他在那个叶子上结束的标签,因此我们可以将确定性程度分配给我们预测标签的那个叶子。
例如,考虑以下数据
我们运行它,并将分数分配给输出,而不是实际的标签。有了这个,我们可以画一条 ROC 曲线,就像这里建议的那样
但是,用它来调整阈值没有什么意义(因为当然,决策树中没有阈值之类的东西),但它仍然可以用来计算 AUC,在这种情况下为 0.92
此处使用的 R 代码:
outlook = c('rain', 'overcast', 'rain', 'sunny', 'rain',
'rain', 'sunny', 'overcast', 'overcast', 'overcast',
'sunny', 'sunny', 'rain', 'rain', 'overcast',
'sunny', 'overcast', 'overcast', 'sunny', 'sunny',
'sunny', 'overcast')
humidity = c(79, 74, 80, 60, 65, 79, 60, 74, 77, 80,
71, 70, 80, 65, 70, 56, 80, 70, 56, 70,
71, 77)
windy = c(T, T, F, T, F, T, T, T, T, F, T, F, F, F, T, T, F, T, T, F, T, T)
play = c(F, F, T, F, T, F, F, T, T, T, F, F, T, T, T, T, T, T, F, T, F, T)
game = data.frame(outlook, humidity, windy, play)
game$score = NA
attach(game)
game$score[outlook == 'sunny' & humidity <= 70] = 5/8
game$score[outlook == 'sunny' & humidity > 70] = 1 - 3/4
game$score[outlook == 'overcast'] = 4/5
game$score[outlook == 'rain' & windy == T] = 1 - 2/2
game$score[outlook == 'rain' & windy == F] = 3/3
detach(game)
game$predict = game$score >= 0.5
game$correct = game$predict == game$play
library(ROCR)
pred = prediction(game$score, game$play)
roc = performance(pred, measure="tpr", x.measure="fpr")
plot(roc, col="orange", lwd=2)
lines(x=c(0, 1), y=c(0, 1), col="red", lwd=2)
auc = performance(pred, 'auc')
slot(auc, 'y.values')