如何根据预测生成 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。在这种情况下,我使用了您的 actualPrY 字段。希望这可以帮助您了解如何进行计算。

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 面积?的主要内容,如果未能解决你的问题,请参考以下文章

AUC ROC曲线

AUC、ROC、FROC简介

ROC曲线是通过样本点分类概率画出的 例如某一个sample预测为1概率为0.6 预测为0概率0.4这样画出来,此外如果曲线不是特别平滑的话,那么很可能存在过拟合的情况

用随机森林计算 ROC AUC

不同的结果 roc_auc_score 和 plot_roc_curve

1万字说明白Receiver Operating curve(ROC) 受试者操作特征曲线