= ROC 曲线及 AUC 值 == ROC 曲线及 AUC 值解读 image::chapter-sc/roc/roc.png[] === ROC 曲线坐标轴 . X轴(误警率): 模型在某个截断点的误警率 . Y轴(命中率): 模型在某个截断点的命中率 . Z轴(截断点): 按预测违约概率进行分段 在实际绘制 ROC 曲线时,只包含 X 和 Y 轴,没有 Z 轴,这里为了便于理解,引入 Z 轴。那么 ROC 曲线是如何绘制的呢? 模型区分能力验证主要验证模型预测情况和实际表现情况的关系。对于风险模型,模型预测的是一个客户的违约概率,模型的实际表现情况是一个客户是否违约。 两者是不能直接进行比较的,所以需要引入截断点,截断点是将模型预测的违约概率进行等分,我们知道违约概率是一个介于 0 到 1 的百分比数, 假如我们将其等分为 20 个段,那么组成这些截断点的数列为(共21个): 1,0.95,0.90,0.85,...,0.05,0。这些截断点就构成了 Z 轴。 [%autowidth] |=== | 截断点序号 | 截断点违约概率(大于等于) | 1 | 1.00 | 2 | 0.95 | 3 | 0.90 | 4 | 0.85 | 5 | 0.80 | 6 | 0.75 | 7 | 0.70 | 8 | 0.65 | 9 | 0.60 | 10 | 0.55 | 11 | 0.50 | 12 | 0.45 | 13 | 0.40 | 14 | 0.35 | 15 | 0.30 | 16 | 0.25 | 17 | 0.20 | 18 | 0.15 | 19 | 0.10 | 20 | 0.05 | 21 | 0.00 |=== 那么这些截断点在 ROC 曲线上所代表的含义是什么呢?在 ROC 曲线的 Z 轴(虚拟的)代表当模型预测的违约概率大于等于其截断点值时被认为预测此客户为违约。 . 截断点 1 : 把模型预测违约概率为 1 的客户认定为模型预测此客户将违约 . 截断点 0.95: 把模型预测违约概率大于等于 0.95 的客户认定为模型预测此客户将违约 . 截断点 0.90: 把模型预测违约概率大于等于 0.90 的客户认定为模型预测此客户将违约 . 依次类推 === ROC 曲线绘制 在有了上述截断点的概念的情况下,我们就可以分别计算出在某个截断点(大于等于某个违约概率被认为预测为违约)模型的命中率和误警率, 然后在基于命中率和误警率坐标系中绘制一个点,这样就能根据截断点的个数绘制出多个坐标点,将这些坐标点通过平滑曲线连接,便绘制出 ROC 曲线。 === 随机模型(完全没有预测能力的模型)的表现 此类模型在任何一个截断点下,其命中率(预测成功率)和误警率(预测失败率)相同,那就等于用扔硬币猜正反面来预测,所以此类模型不具有预测能力。在上图中表现为正方形的对角线。 === 完美模型(理想模型)的表现 如果一个模型预测为违约客户,而实际上这些客户就发生了违约,那么这个模型就是完美的,即和实际一致。在上图中表现为一条水平线段(命中率为 1 的水平线段)。 === 现实中较好模型的表现 现实中较好的模型表现为介于完美模型和随机模型之间的曲线,曲线越接近于完美曲线越好。 === AUC 值 直观的讲,AUC 的值就是上面 ROC 曲线和 X 轴构成的图像的面积,即小图中黄色部分的面积。 image::chapter-sc/roc/roc2.png[] . 完美模型 AUC 值: 1*1 =1 . 随机模型 AUC 值: 1*1/2 =0.5 . 现实中较好模型 AUC 值: 介于完美模型和随机模型 AUC 值之间,越接近 1 越好。 == ROC 曲线及 AUC 值系统实现 [#ROC_KPI] === ROC 指标表 对每个需要验证的模型根据截断点分别对 <> 进行样本个数统计。 |=== | 模型标识 | 模型名称 | 截断点 | 实际违约且预测违约样本总数 | 实际违约且预测正常样本总数 | 实际正常且预测违约样本总数 | 实际正常且预测正常样本总数 | 实际违约样本总数 | 实际正常样本总数 | 违约预测命中率(Y) | 违约预测误警率(X) | | | 大于等于 | DD | DN | ND | NN | TD=DD+DN | TN=ND+NN | DD/TD | ND/TN | M1 | 模型1 | 1 | 10 | 1 | 2 | 20 | 11 | 22 | 0.9091 | 0.0909 | M1 | 模型1 | 0.95 | 10 | 1 | 2 | 20 | 11 | 22 | 0.9091 | 0.0909 | M1 | 模型1 | 0.90 | 10 | 1 | 2 | 20 | 11 | 22 | 0.9091 | 0.0909 | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | M1 | 模型1 | 0.05 | 10 | 1 | 2 | 20 | 11 | 22 | 0.9091 | 0.0909 | M1 | 模型1 | 0 | 10 | 1 | 2 | 20 | 11 | 22 | 0.9091 | 0.0909 |=== 上表中每一行代表某个模型的一个截断点下的命中率和误警率。其字段意义说明如下: |=== | 字段中文名称 | 字段名称 | 字段类型 | 字段约束 | 备注 | 模型标识 | FD_MODEL_ID | varchar(32) | 不能为空 | | 模型名称 | FD_MODEL_NAME | varchar(100) | 不能为空 | | 违约概率截断点 | FD_PD_CUT_OFF_POINT | 小数(精度 6) | 不能为空 |对违约概率进行平分,代表在大于等于截断点时的数据 | 实际违约且预测违约样本总数 | FD_DD | 整数 | 不能为空 | | 实际违约且预测正常样本总数 | FD_DN | 整数 | 不能为空 | | 实际正常且预测违约样本总数 | FD_ND | 整数 | 不能为空 | | 实际正常且预测正常样本总数 | FD_NN | 整数 | 不能为空 | | 实际违约样本总数 | FD_DT | 整数 | 不能为空 | FD_DT=FD_DD+FD_DN | 实际正常样本总数 | FD_NT | 整数 | 不能为空 | FD_NT=FD_ND+FD_NN | 违约预测命中率(Y) | FD_Y | 小数(精度 6) | 不能为空 | FD_Y=FD_DD/FD_TD | 违约预测误警率(X) | FD_X | 小数(精度 6) | 不能为空 | FD_X=FD_ND/FD_TN |=== === ROC 曲线绘制 通过 <> 中的 X 和 Y 值 绘制并连接各个点 === AUC 值计算 在具体的实现时,可以采用分割成多个梯形进行面积相加。 计算公式: image::chapter-sc/roc/auc.png[]