解题思路
AUC 可以不画 ROC,直接用秩统计算。把每笔交易按风险分从小到大排,名次从 1 起。分数相同的几笔不能拆开,它们合占第 L 到第 R 个位置,每笔都记平均名次 (L+R)/2。
- 排序后扫一遍,把同分区间扩满,再把区间内所有下标写成同一个平均名次。
- 记欺诈笔数为 k,正常笔数为 g,欺诈样本的名次之和为 S。若欺诈全部排在最前面,名次和最小是 1+⋯+k=k(k+1)/2。多出来的部分 V=S−k(k+1)/2 就是正类“赢过”负类的对数(并列计 0.5)。
- 一共有 k⋅g 对正负样本,因此 AUC=V/(k⋅g)。输出必须保留 6 位小数。
- 常见假解:并列时按出现顺序硬拆成 1,2,3;名次从 0 起;按分数从大到小编号却仍套同一公式;只统计严格大于、并列不算 0.5。
题目内容
风控侧要对一批交易做欺诈打分。每笔交易有真实标签 ti(0 表示正常,1 表示欺诈)以及模型给出的风险分 si(越大越像欺诈)。
请按 Mann-Whitney U 的秩统计来评估这批打分的排序质量,也就是 AUC。分数相同的交易必须用平均名次,不能随便拆开。
规则如下:
- 平均名次:把 m 笔交易按 s 从小到大排。名次从 1 起。若连续若干笔分数相同,占住第 L 到第 R 个位置,则它们的名次都取 (L+R)/2。
- 由正类名次和还原 AUC:记欺诈笔数为 k,正常笔数为 g,欺诈样本的名次之和为 S。令
V=S−k(k+1)/2,AUC=V/(k⋅g)。
输入描述
第一行一个整数 m,表示交易笔数。(2≤m≤19)
第二行 m 个整数 ti,即标签,元素只能是 0 或 1。保证两种标签都出现。
第三行 m 个浮点数 si,即风险分。
输出描述
输出一行一个浮点数,表示 AUC,必须恰好保留 6 位小数。
样例1
输入
4
0 0 0 1
0.1 0.2 0.9 0.5
输出
0.666667
说明
- 按分数升序:(0.1,0) 名次 1,(0.2,0) 名次 2,(0.5,1) 名次 3,(0.9,0) 名次 4。
- 欺诈只有一笔,名次 S=3,k=1,g=3。
- V=3−1=2,AUC=2/3=0.666667。
样例2
输入
3
0 1 1
0.5 0.5 0.8
输出
0.750000
说明
- 两个 0.5 并列占第 1、2 名,平均名次都是 1.5;分数 0.8 的名次是 3。
- 欺诈名次和 S=1.5+3=4.5,k=2,g=1。
- V=4.5−3=1.5,AUC=1.5/2=0.750000。