我知道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
计算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。
迟到了,但这里是一些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")