如何根据预测生成 AUC/Roc 面积?
Posted
技术标签:
【中文标题】如何根据预测生成 AUC/Roc 面积?【英文标题】:Does anyone know how to generate AUC/Roc Area based on the predition?有谁知道 【发布时间】:2013-02-19 23:40:27 【问题描述】:我知道 weka 中的 AUC/ROC 区域 (http://weka.wikispaces.com/Area+under+the+curve) 是基于 e Mann Whitney 统计 (http://en.wikipedia.org/wiki/Mann-Whitney_U)
但我的疑问是,如果我有 10 个标记实例(Y 或 N,二进制目标属性),通过将算法(即 J48)应用于数据集,那么这 10 个实例上有 10 个预测标签。那我到底应该用什么来计算 AUC_Y、AUC_N 和 AUC_Avg?使用预测的排名标签 Y 和 N 还是实际标签(Y' 和 N')?或者我需要计算TP率和FP率?
谁能给我一个小例子,并指出我应该使用哪些数据来计算基于 Mann Whitney 统计方法的 AUC?提前致谢。
样本数据:
inst# actual predicted error PrY PrN
1 1:y 1:y *0.973 0.027
2 1:y 1:y *0.999 0.001
3 2:n 1:y + *0.568 0.432
4 2:n 2:n 0.382 *0.618
5 1:y 2:n + 0.421 *0.579
6 2:n 2:n 0.146 *0.854
7 1:y 1:y *1 0
8 1:y 1:y *0.999 0.001
9 2:n 2:n 0.11 *0.89
10 1:y 2:n + 0.377 *0.623
【问题讨论】:
AUC_Y、AUC_N 和 AUC_Avg 是什么意思? Afaik,只有 AUC。 【参考方案1】:计算 AUC 是基于您的结果排名。我刚刚阅读了 Mann-Whitney-U 统计数据,我认为这基本上是我在代码中一直这样做的方式。
首先,您需要对结果进行排名。通常,这是您的分类器的决策值(例如distance to the hyperplane for SVMs),但 WEKA 主要使用类概率。在您的示例中,PrY 和 PrN 之和为 1,这很好,因此您可以选择其中一个,例如 PrY。
然后您按 PrN 对您的实例进行排名:
inst# actual predicted error PrY PrN
7 1:y 1:y *1 0
8 1:y 1:y *0.999 0.001
2 1:y 1:y *0.999 0.001
1 1:y 1:y *0.973 0.027
3 2:n 1:y + *0.568 0.432
5 1:y 2:n + 0.421 *0.579
4 2:n 2:n 0.382 *0.618
10 1:y 2:n + 0.377 *0.623
6 2:n 2:n 0.146 *0.854
9 2:n 2:n 0.11 *0.89
根据 Wikipedia 关于 Mann-Whitney-U 统计的内容,您现在需要总结每个 实际 类,它被另一个类“击败”的频率。对于正例 (y),这将是
0, 0, 0, 0, 1, 2 => Sum: 3
对于否定实例(n)
4, 5, 6, 6 => Sum: 21
所以 U_y = 3 和 U_n = 21,检查一下:
U_y + U_n = 24 = 6 * 4 = #y * #n
AUC_y 然后是(wikipedia 之后)
AUC_y = U_y / (#y * #n) = 3 / 24 = 0.125
AUC_n = U_n / (#y * #n) = 21 / 24 = 0.875
现在,在这种情况下,我坚信 AUC_n 是您想要的 AUC。我们对 PrN 进行了升序排序,所以 AUC_n 就是我们想要的。
对我们刚刚所做的事情的更直观和图形化的描述是这样的:
我们根据实例的决策值/类别概率对实例进行排序。如果我们按 PrN 升序排序,则积极的应该排在第一位。 (如果我们按 PrY 升序排序,负数应该在前。)现在我们画一个图,从坐标 (0,0) 开始。每次我们遇到一个实际的正面实例,我们就画一个单元。每次遇到负例,我们就画一个单位。这条线现在分隔成区域,在 ASCII 艺术中看起来像这样(我会尽快用像样的图像替换它):
|..##|
|.###|
|####|
|####|
|####|
|####|
分隔线是 ROC,它下面的区域(因此得名)是 AUC。这里的 AUC 是 21 个单位,我们需要通过将其除以 24 的总面积来归一化,得到 21/24 = 0.875
您还可以进行已经标准化的整个计算,这相当于将其绘制为 FPR 与 TPR。
【讨论】:
很详细的解释@Sentry!!非常感谢!! 谁能告诉我,这些值 0,0,0,1,2 和 4,5,6,6 是如何获得的。 @Sangeeta 在图形表示中,4,5,6,6 是列的高度。但你最好看看这个解释:en.wikipedia.org/wiki/Mann%E2%80%93Whitney_U_test#Examples 谢谢!获取链接! @Sangeeta 否,因为 ROC 曲线只能通过调查每个可能/相关阈值的分类器来获得。请参阅en.wikipedia.org/wiki/Receiver_operating_characteristic:“曲线是通过在各种阈值设置下绘制真阳性率 (TPR) 与假阳性率 (FPR) 来创建的。”【参考方案2】:聚会迟到了,但这是我编写的一些 R 代码,用于根据您的数据 AUC 计算并绘制 ROC。在这种情况下,我使用了您的 actual
和 PrY
字段。希望这可以帮助您了解如何进行计算。
true_Y = c(1,1,1,1,2,1,2,1,2,2)
probs = c(1,0.999,0.999,0.973,0.568,0.421,0.382,0.377,0.146,0.11)
getROC_AUC = function(probs, true_Y)
probsSort = sort(probs, decreasing = TRUE, index.return = TRUE)
val = unlist(probsSort$x)
idx = unlist(probsSort$ix)
roc_y = true_Y[idx];
stack_x = cumsum(roc_y == 2)/sum(roc_y == 2)
stack_y = cumsum(roc_y == 1)/sum(roc_y == 1)
auc = sum((stack_x[2:length(roc_y)]-stack_x[1:length(roc_y)-1])*stack_y[2:length(roc_y)])
return(list(stack_x=stack_x, stack_y=stack_y, auc=auc))
aList = getROC_AUC(probs, true_Y)
stack_x = unlist(aList$stack_x)
stack_y = unlist(aList$stack_y)
auc = unlist(aList$auc)
plot(stack_x, stack_y, type = "l", col = "blue", xlab = "False Positive Rate", ylab = "True Positive Rate", main = "ROC")
axis(1, seq(0.0,1.0,0.1))
axis(2, seq(0.0,1.0,0.1))
abline(h=seq(0.0,1.0,0.1), v=seq(0.0,1.0,0.1), col="gray", lty=3)
legend(0.7, 0.3, sprintf("%3.3f",auc), lty=c(1,1), lwd=c(2.5,2.5), col="blue", title = "AUC")
【讨论】:
能否请教如何通过 rWeka 计算 ROC AUC?以上是关于如何根据预测生成 AUC/Roc 面积?的主要内容,如果未能解决你的问题,请参考以下文章
ROC曲线是通过样本点分类概率画出的 例如某一个sample预测为1概率为0.6 预测为0概率0.4这样画出来,此外如果曲线不是特别平滑的话,那么很可能存在过拟合的情况