形象理解AUC计算公式
AUC是评价一个二分类器性能的主流数值指标,定义为ROC曲线下方的面积,但这个算起来比较复杂,需要统计假阳性。另一个定义更直观,随机给一个正样本和一个负样本,多大概率正样本的score更高。
换一种说法,假设正样本有 M M M个,负样本有 N N N个,在所有 M ∗ N M*N M∗N个正负样本对中,有多少正样本比负样本分高。提高AUC意味着,将所有样本按score排序,正样本要尽量排在负样本前面。各大博客贴出的AUC计算公式为
A U C = ∑ 正 样 本 R a n k i − 0.5 ∗ ( M + 1 ) ∗ M M ∗ N AUC=\frac{\sum_{正样本}{Rank_i} – 0.5 * (M+1) * M}{M*N} AUC=M∗N∑正样本Ranki−0.5∗(M+1)∗M
下面给不能一眼看懂这个公式的童鞋(比如当年的我)举几个例子,希望能有帮助。
举个例子—- n 2 n^2 n2算法
| Rank | 5 | 4 | 3 | 2 | 1 |
|---|---|---|---|---|---|
| 正负性 | + | + | – | – | – |
如果稍差一点,6个正负样本[(5, 4), (5, 2), (5, 1), (3, 4), (3, 2), (3, 1)]对中只有(3, 4)正样本没排在负样本之前, A U C = 5 / 6 AUC=5/6 AUC=5/6
| Rank | 5 | 4 | 3 | 2 | 1 |
|---|---|---|---|---|---|
| 正负性 | + | – | + | – | – |
再看,这次[(5, 4), (5, 3), (5, 1), (2, 4), (2, 3), (2, 1)] 里有2个正样本没排在负样本之前, A U C = 4 / 6 AUC = 4/6 AUC=4/6
| Rank | 5 | 4 | 3 | 2 | 1 |
|---|---|---|---|---|---|
| 正负性 | + | – | – | + | – |
改进—-动态规划
上面的穷举法时间复杂度为 O ( n 2 ) O(n^2) O(n2), 其实可以考虑,对每个正样本来说,它能贡献分子中的几项,比如上面的例子,右边有几个样本可以用动态规划从右往左扫一遍得出,贡献几项可以这样得出:e.g. Rank为 r r r的正样本比它后面 r − 1 r-1 r−1个样本排得前,扣除它右边的正样本数即可,复杂度 O ( n ) O(n) O(n)。
| Rank | 5 | 4 | 3 | 2 | 1 |
|---|---|---|---|---|---|
| 正负性 | + | – | – | + | – |
| 右边有几个正样本 | 1 | 1 | 1 | 0 | 0 |
| 贡献几项 | 5-1-1=3 | 0 | 0 | 2-1=1 | 0 |
再进一步
由上可知, A U C AUC AUC的分子计算需要对正样本的Rank值求和,减正样本数,再扣除每个正样本右边正样本的数量之和,聪明的你一定发现了,既然有 M M M个正样本,右边正样本数量之和一定为 ( M − 1 ) + . . . + 2 + 1 (M-1) + … + 2 + 1 (M−1)+...+2+1,那么分子就是
∑ i = 1 M R a n k 正 样 本 i − M − [ ( M − 1 ) + . . . + 2 + 1 ] = ∑ i = 1 M R a n k 正 样 本 i − M ( M + 1 ) 2 \sum_{i=1}^{M}{Rank_{正样本i}} – M – [(M-1) + … + 2 + 1] = \sum_{i=1}^{M}{Rank_{正样本i}} – \frac{M(M+1)}{2} i=1∑MRank正样本i−M−[(M−1)+...+2+1]=i=1∑MRank正样本i−2M(M+1)
(完)
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/175747.html原文链接:https://javaforall.net
