2

我知道 weka 中的 AUC/ROC 区域(http://weka.wikispaces.com/Area+under+the+curve)基于 e Mann Whitney 统计数据(http://en.wikipedia.org/wiki/Mann -惠特尼_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
4

2 回答 2

4

计算 AUC 是基于您的结果排名。我刚刚阅读了 Mann-Whitney-U 统计数据,我认为这基本上是我在代码中一直这样做的方式。

首先,你需要一些东西来对你的结果进行排名。通常,这是分类器的决策值(例如,到 SVM 的超平面的距离),但 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。

于 2013-03-09T20:06:23.783 回答
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")

在此处输入图像描述

于 2013-09-27T21:15:18.377 回答