2. 评估指标体系:常用收益评估指标(AUC、KS、Lift、Profit Curve)详解
在风控模型上线后,仅关注模型精度(如准确率、召回率)远远不够。业务收益才是衡量模型价值的最终标尺。本章将深入解析四个最核心的收益评估指标:AUC、KS、Lift 和 Profit Curve,并说明它们在 Spark 大规模评估场景下的计算逻辑与业务含义。
2.1 指标全景与适用场景
不同指标从不同维度刻画模型收益,下表总结了它们的核心差异与典型用途:
| 指标 | 核心含义 | 取值范围 | 主要用途 | 对业务收益的反映 |
|---|---|---|---|---|
| AUC | 模型对正负样本的排序能力 | [0.5, 1.0] | 模型整体区分度评估 | 间接:排序越好,策略空间越大 |
| KS | 正负样本累积分布的最大差异 | [0, 1.0] | 模型在某个阈值下的最佳区分能力 | 间接:KS 越高,分箱效果越好 |
| Lift | 模型筛选相比随机筛选的提升倍数 | [1, +∞) | 营销响应、催收优先级排序 | 直接:提升倍数越高,单位成本收益越大 |
| Profit Curve | 不同阈值下的累计利润曲线 | (-∞, +∞) | 最优决策阈值选择、业务盈亏平衡分析 | 直接:利润最大化的阈值即为最优策略 |
评估优先级建议:在风控收益复盘时,建议按 Profit Curve → Lift → KS → AUC 的顺序进行诊断。Profit Curve 直接反映利润,Lift 反映筛选效率,KS 和 AUC 用于排查模型排序能力是否退化。
2.2 AUC:排序能力的黄金标准
AUC(Area Under the ROC Curve)衡量模型将正样本排在负样本之前的概率。在 Spark 中,AUC 的计算通常基于排序后的预测概率与真实标签。
Spark 计算要点:
- 使用
BinaryClassificationMetrics类直接计算 AUC。 - 对于大规模数据,先按预测概率降序排序,再通过累加正负样本数计算 ROC 曲线下的面积。
- AUC 对样本不平衡不敏感,但无法反映具体阈值下的业务收益。
// Spark Scala 示例:计算 AUC
import org.apache.spark.mllib.evaluation.BinaryClassificationMetrics
val scoreAndLabels = predictions
.select("probability", "label")
.rdd.map(row => (row.getAs[Double]("probability"), row.getAs[Double]("label")))
val metrics = new BinaryClassificationMetrics(scoreAndLabels)
val auc = metrics.areaUnderROC()
println(s"AUC = $auc")
复盘异常信号:如果 AUC 低于 0.6,说明模型排序能力接近随机,此时 Lift 和 Profit Curve 通常也会表现极差,需要立即检查特征分布偏移或模型过拟合。
2.3 KS:最大区分力阈值
KS(Kolmogorov-Smirnov)统计量衡量正负样本累积分布之间的最大垂直距离。KS 值越高,模型在某个阈值下的区分能力越强。
KS 计算步骤:
- 将预测概率分为 N 个等频分箱(通常 10 箱或 20 箱)。
- 计算每个分箱中正样本占比(TPR)和负样本占比(FPR)。
- 计算累积 TPR 与累积 FPR 的差值,取最大值即为 KS。
-- Spark SQL 示例:分箱计算 KS
WITH bins AS (
SELECT
NTILE(10) OVER (ORDER BY probability DESC) AS bin_id,
label
FROM predictions
),
bin_stats AS (
SELECT
bin_id,
SUM(IF(label=1, 1, 0)) AS pos_cnt,
SUM(IF(label=0, 1, 0)) AS neg_cnt
FROM bins
GROUP BY bin_id
)
SELECT
MAX(ABS(cum_pos / total_pos - cum_neg / total_neg)) AS ks_value
FROM (
SELECT
SUM(pos_cnt) OVER (ORDER BY bin_id) AS cum_pos,
SUM(neg_cnt) OVER (ORDER BY bin_id) AS cum_neg,
(SELECT SUM(pos_cnt) FROM bin_stats) AS total_pos,
(SELECT SUM(neg_cnt) FROM bin_stats) AS total_neg
FROM bin_stats
)
业务解读:KS 在 0.3~0.5 之间通常表示模型有较好的区分能力。如果 KS 超过 0.7,需要警惕过拟合或特征泄露;如果 KS 低于 0.2,模型基本不可用。
2.4 Lift:筛选效率的放大镜
Lift 曲线展示模型筛选出的 Top N% 样本中,正样本浓度是随机筛选的多少倍。Lift 越高,说明模型在头部样本的命中效率越高。
Lift 计算公式:
- Lift@k% = (Top k% 样本中的正样本率) / (全量样本中的正样本率)
- 例如:全量坏账率 2%,模型筛选 Top 10% 样本的坏账率为 12%,则 Lift@10% = 6。
在 Spark 中计算 Lift:
-- Spark SQL 示例:计算 Lift@10%
WITH ranked AS (
SELECT
probability,
label,
PERCENT_RANK() OVER (ORDER BY probability DESC) AS pct_rank
FROM predictions
),
top10 AS (
SELECT AVG(IF(label=1, 1.0, 0.0)) AS top_rate
FROM ranked
WHERE pct_rank <= 0.1
),
overall AS (
SELECT AVG(IF(label=1, 1.0, 0.0)) AS overall_rate
FROM predictions
)
SELECT top_rate / overall_rate AS lift_at_10
FROM top10, overall
复盘关注点:如果 Lift 曲线在头部(如 5%~20%)出现快速下降,说明模型只对极少数样本有效,泛化能力不足。此时应检查特征是否过度拟合了少数异常样本。
2.5 Profit Curve:直接衡量业务利润
Profit Curve 将模型输出概率与业务成本、收益直接挂钩,计算不同阈值下的累计利润。这是风控收益复盘中最具决策价值的指标。
Profit Curve 构建步骤:
- 定义业务参数:审批通过后的平均收益(Revenue)、坏账损失(Loss)、审批成本(Cost)。
- 按预测概率降序排序,依次计算每个样本的边际利润。
- 绘制累计利润随样本比例变化的曲线。
- 曲线最高点对应的阈值即为最优决策点。
// Spark Scala 示例:计算 Profit Curve 数据点
val revenuePerGood = 100.0 // 好客户平均收益
val lossPerBad = 500.0 // 坏客户平均损失
val costPerCheck = 10.0 // 审批成本
val profitData = predictions
.orderBy(col("probability").desc)
.select(
when(col("label") === 1.0, revenuePerGood).otherwise(-lossPerBad) - costPerCheck
.alias("profit_per_sample")
)
.select(
sum("profit_per_sample").over(Window.orderBy("probability").rowsBetween(Long.MinValue, 0))
.alias("cumulative_profit")
)
异常复盘关键:如果 Profit Curve 的最高点出现在样本比例极低(如 5%)或极高(如 95%)的位置,说明模型对业务参数的敏感性极高,需要重新校准成本收益参数,或检查是否存在严重的样本偏差。
2.6 四指标联动分析框架
在实际复盘时,四个指标需要联动分析,才能定位收益异常的根本原因。下图展示了四指标之间的逻辑关系与诊断路径:
2.7 异常复盘检查清单
在 Spark 模型收益评估异常复盘时,请对照以下清单逐项排查:
| 检查项 | 指标 | 异常信号 | 可能原因 | 排查动作 |
|---|---|---|---|---|
| 排序能力 | AUC | 环比下降 > 0.05 | 特征分布偏移、数据质量下降 | PSI 检测、特征空值率检查 |
| 区分力 | KS | KS < 0.2 或 > 0.7 | 模型欠拟合 / 过拟合 | 分箱单调性检验、学习曲线检查 |
| 筛选效率 | Lift | Lift@10% 环比下降 > 20% | 样本选择偏差、营销策略变化 | PSM 匹配检验、策略回溯分析 |
| 业务收益 | Profit Curve | 最优阈值偏移 > 10% | 成本收益参数变化、外部环境变化 | 参数敏感性分析、A/B 测试验证 |
最佳实践:建议在 Spark 中建立自动化评估 Pipeline,每天产出四指标报表,并设置环比告警阈值。当任意指标触发告警时,自动触发特征分布诊断和参数校准流程,将异常发现时间从周级缩短到小时级。