有谁知道如何根据predition产生AUC / ROC面积?(Does anyone know h

2019-08-17 07:26发布

我知道AUC / ROC面积( http://weka.wikispaces.com/Area+under+the+curve在秧鸡)是基于电子曼惠特尼统计( http://en.wikipedia.org/wiki/Mann -Whitney_U )

但我的疑问是,如果我有10种标记的情况下(是或否,二进制目标属性),通过应用算法(即J48)到数据集,则有10个预测这些10个实例标签。 那么究竟我应该用什么来计算AUC_Y,AUC_N和AUC_Avg? 使用预测的排名标签Y和N或实际标签(Y“和N”)? 或者,我需要计算TP率和FP率是多少?

谁能给我一个小例子,并指向我,我应该使用什么样的数据基于曼惠特尼统计方法计算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

Answer 1:

计算AUC是根据排名结果。 我刚刚阅读了关于曼 - 惠特尼U统计,我认为这基本上是我要做的事在我的代码所有的时间。

首先,你需要的东西的排名结果。 通常情况下,这是你的分类(如决定价值超平面的支持向量机的距离 ),但WEKA大多采用类概率。 在你的榜样,撬和PRN总结到1,这是很好的,所以你可以选择任何一个,说撬。

然后,您可以通过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 

从什么维基百科说,关于曼-惠特尼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会(后维基百科 )

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上升的积极因素应该是第一位的。 (如果我们排序撬提升,消极因素应该是第一位的。)现在我们画一个图,坐标为(0,0)开始。 每次我们遇到的一个实际的积极实例,我们得出一个单位了。 每次我们遇到一个反例,我们得出一个单位的权利。 这条线现在分开的地区,它看起来像这样ASCII艺术(我会用一个体面的形象,只要我可以取代它):

|..##|
|.###|
|####|
|####|
|####|
|####|

分隔线是ROC和其下的AUC的面积(因此而得名)。 所述AUC这里是21个单位,这是我们需要通过将其除以24的总面积归一化,得到21/24 = 0.875

你也可以做整个计算已经常态化,这相当于绘制它作为FPR VS TPR。



Answer 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")



文章来源: Does anyone know how to generate AUC/Roc Area based on the predition?