我试图使用MySQL对表中的数据进行计算,如下所示:
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。,有人能告诉我这背后的直觉吗?
我对梯形法已经很熟悉了,就是把小梯形的面积与中华民国曲线下的面积相加。
发布于 2020-09-25 18:06:43
简短回答:这是Wilcoxon-Mann的统计数据,见https://en.wikipedia.org/wiki/Receiver_operating_characteristic#Area_under_the_curve页面也有证据。
公式的底部部分与wiki中的公式相同。最上面的部分更棘手。wiki中的f
对应于数据中的p
,t_0
和t_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
?我们知道,由于值是排序的,所以p
的确切值小于或等于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),
其中n
是y
列中的总数。现在我们需要再简化一次。请注意,
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
完成了你找到的公式的证明。
我认为把这个问题写在数学或统计数据溢出上会更有意义。
https://stackoverflow.com/questions/64068533
复制相似问题