如何计算ROC AUC的方法或公式是如何工作的?

3

我正在尝试使用MySQL计算类似下表中的数据的AUC:

y   p
1   0.872637
0   0.130633
0   0.098054
...
...
1   0.060190
0   0.110938

我发现了以下的SQL查询语句,它可以正确地给出AUC分数(我使用sklearn方法进行了验证)。

 SELECT (sum(y*r) - 0.5*sum(y)*(sum(y)+1)) / (sum(y) * sum(1-y)) AS auc
 FROM ( 
   SELECT y, row_number() OVER (ORDER BY p) r
   FROM probs
 ) t

 Using pandas this can be done as follows:

 temp = df.sort_values(by="p")
 temp['r'] = np.arange(1, len(df)+1, 1)
 temp['yr'] = temp['y']*temp['r']
 print( (sum(temp.yr) - 0.5*sum(temp.y)*(sum(temp.y)+1)) / (sum(temp.y) * sum(1-temp.y)) )

我不理解我们如何使用这种方法计算AUC。 有人能给出背后的直觉吗?

我已经熟悉了梯形法,它涉及在ROC曲线下求小梯形的面积之和。

1个回答

2
简短回答:这是Wilcoxon-Mann-Whitney统计量,详情请参见https://en.wikipedia.org/wiki/Receiver_operating_characteristic#Area_under_the_curve。该页面还有证明。
你公式的底部与维基中的公式完全相同。顶部比较棘手。维基中的f对应于你数据中的p,而t_0t_1是数据框中的索引。请注意,我们首先按p排序,这使我们的生活更轻松。
请注意,双重求和可以分解为
Sum_{t_1 such that y(t_1)=1} #{t_0 such that p(t_0) < p(t_1) and y(t_0)=0}

这里的#代表这样的索引总数。

对于每个行索引t_1(使得y(t_1)=1),有多少个t_0满足p(t_0) < p(t_1)y(t_0)=0?我们知道,恰好有t_1p值小于或等于t_1,因为这些值是已排序的。我们得出结论:

#{t_0: p(t_0) < p(t_1) and y(t_0)=1) = t_1 - #{t_0: t_0 <= t_1 and y(t_0)=1}

现在,想象一下向下滚动经过排序的数据框。首次我们遇到y=1时,#{t_0: t_0 <= t_1 and y(t_0)=1}=1;第二次我们遇到y=1,相同的数量为2;第三次我们遇到y=1,数量为3,以此类推。因此,当我们将所有索引t_1上的相等性加起来时,其中y=1,我们得到:

Sum_{t_1: y(t_1)=1}#{t_0: p(t_0) < p(t_1) and y(t_0)=1) = Sum_{t_1: y(t_1)=1} t_1 - (1 + 2 + 3 + ... + n),

其中ny列中所有1的总数。现在我们需要再进行一次简化。注意到

Sum_{t_1: y(t_1)=1} t_1 = Sum_{t_1: y(t_1)=1} t_1 y(t_1)

如果y(t_1)不是1,那么它就是0。因此,
Sum_{t_1: y(t_1)=1} t_1 = Sum_{t_1: y(t_1)=1} t_1 y(t_1) = Sum_{t} t y(t)

将其插入到我们的公式中并使用。
1 + 2+ 3 + ... + n = n(n+1)/2

我已经完成了你发现的公式的证明。

P.S. 我认为在数学或统计溢出上发布这个问题会更有意义。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接