如何为决策树绘制ROC曲线?


13

通常,我们无法为决策树等离散分类器绘制ROC曲线。我对吗?有什么方法可以绘制Dtree的ROC曲线吗?


1
:你可以在这里找到你的aswer stats.stackexchange.com/questions/105501/...
rapaio

[R中的“训练集”与“测试集”的决策树模型评估] [1] [1]:stats.stackexchange.com/questions/49416/… 您可以在此处找到答案。
Sangram 2014年

@rapaio对不起,您的链接显示ROC曲线,用于在分类器中查找阈值,该阈值产生1到0(连续值)之间的输出。
DataMiner 2014年

@Sangram这些是R中的解决方案,但我只想了解它是如何工作的。
DataMiner 2014年

Answers:


15

如果您的分类器仅产生因子结果(仅产生标签),而没有得分,您仍然可以绘制ROC曲线。但是,此ROC曲线仅是一点。考虑到ROC空间,这一点是,其中 -误报率和 -。(x,y)=(FPR,TPR)FPRTPR

Wikipedia页面上查看有关如何计算的更多信息。

您可以通过从到您的点,再从该点到画一条线,将此点扩展为ROC曲线。因此,您有一条曲线。(0,0)(1,1)

但是,决策树很容易从标签输出扩展到数字输出。请注意,当您使用决策树进行预测时,您将从根节点下降到叶节点,在该叶节点中使用多数类进行预测。如果您将返回该叶节点中类的比例,而不是该类,则将获得每个类的得分。假设您有两个类和,并且在叶节点中有10个带有实例和5个带有实例,则可以返回一个得分向量:TFTF(scoreT,scoreF)=(countTcountT+countF,countFcountT+countF)=(10/15,5/15)=(0.66,0.33)。请注意,这确实是一个适当的计分规则(这不是概率的最佳估计器),但是总比没有相信的要好,并且这通常是为决策树检索分数的方式。


12

对于决策树,仍然可以一定程度地预测类别。答案已经由@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')
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.