有谁知道如何基于预测生成AUC / Roc区域?

时间:2013-03-05 14:15:40

标签: classification weka evaluation prediction roc

我知道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

2 个答案:

答案 0 :(得分:4)

计算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 

根据维基百科关于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。

答案 1 :(得分: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")

enter image description here