3、混淆矩阵与衍生指标:TP/FP/TN/FN、精确率、召回率、F1-score、KS、AUC在策略评估中的应用

在风控策略的量化评估中,混淆矩阵是所有衍生指标的基石。它通过对比模型预测结果与真实标签,将样本划分为四个象限,从而系统性地衡量策略的“抓坏”能力与“误伤”程度。本节将深入拆解混淆矩阵的核心元素,并推导出精确率、召回率、F1-score、KS与AUC等关键指标,帮助你在Champion选择中做出数据驱动的决策。

3.1 混淆矩阵:四象限定义

混淆矩阵以2×2表格形式呈现,行代表预测类别,列代表真实类别。在风控场景中,通常将“坏客户”(逾期/违约)定义为正类(Positive),“好客户”定义为负类(Negative)。

真实 \ 预测 预测为正类(坏) 预测为负类(好)
实际为正类(坏) TP(真正例)
模型正确识别出的坏客户
FN(假负例)
模型遗漏的坏客户(漏报)
实际为负类(好) FP(假正例)
模型误判的好客户(误报)
TN(真负例)
模型正确识别出的好客户
风控视角记忆法:TP = 抓对的坏人,FP = 误伤的好人,FN = 漏掉的坏人,TN = 放对的好人。策略优化的核心目标就是最大化TP和TN,同时最小化FP和FN。

3.2 核心衍生指标:精确率、召回率与F1-score

基于混淆矩阵的四个基础值,可以衍生出三个最常用的单点评估指标,它们从不同维度刻画策略的“准”与“全”。

  • 精确率(Precision) = TP / (TP + FP)
    含义:在所有被模型判为“坏”的客户中,真正是坏客户的比例。精确率越高,误伤越少。
  • 召回率(Recall) = TP / (TP + FN)
    含义:在所有真正的坏客户中,模型成功抓出的比例。召回率越高,漏报越少。
  • F1-score = 2 × (Precision × Recall) / (Precision + Recall)
    含义:精确率与召回率的调和平均数,用于平衡两者冲突时的综合评估。
实战权衡:在风控策略中,精确率与召回率往往呈负相关。收紧审批阈值会提高精确率(减少误伤),但会降低召回率(增加漏报);反之亦然。F1-score帮助你在两者之间找到最优平衡点,尤其适用于样本不平衡的信贷场景。

3.3 排序能力指标:KS与AUC

与单点指标不同,KS和AUC评估的是模型对好坏客户的排序区分能力,即策略评分卡能否将坏客户的分数集中在低分段,好客户的分数集中在高分段。

指标 计算方式 取值范围 风控含义
KS max(累计TPR - 累计FPR)
其中TPR = TP/(TP+FN),FPR = FP/(FP+TN)
[0, 1] 衡量模型在某个分数切点上最大区分能力。KS > 0.3 通常认为模型可用,> 0.5 表示区分能力极强。
AUC ROC曲线下的面积
ROC曲线以FPR为横轴,TPR为纵轴
[0.5, 1] 衡量模型整体排序能力。AUC = 0.5 表示随机猜测,AUC = 1 表示完美区分。通常AUC > 0.75 为合格模型。
注意:KS和AUC虽然都是排序指标,但KS关注的是最大差距点,对单一阈值敏感;AUC关注的是全局排序,不受阈值选择影响。在Champion选择时,建议同时参考两者,避免被单一指标误导。

3.4 指标联动与策略评估框架

单一指标无法全面反映策略效果。下图展示了混淆矩阵与各衍生指标之间的逻辑关系,以及它们在策略评估中的定位。

混淆矩阵与衍生指标联动框架 TP(真正例) 抓对的坏人 FN(假负例) 漏掉的坏人 FP(假正例) 误伤的好人 TN(真负例) 放对的好人 精确率 召回率 F1-score KS / AUC 评估维度总结 • 精确率/召回率/F1:单点阈值评估 • KS:最大区分能力评估 • AUC:全局排序能力评估

3.5 实战案例:Champion选择中的指标对比

假设我们有两个备选策略模型A和B,在验证集上的表现如下表所示。请根据综合指标选择最优策略。

指标 策略A 策略B 解读
精确率 0.85 0.78 A误伤更少
召回率 0.60 0.75 B抓坏更全
F1-score 0.70 0.76 B综合更优
KS 0.42 0.48 B区分能力更强
AUC 0.82 0.85 B排序能力更优
决策建议:虽然策略A的精确率更高(误伤少),但策略B在召回率、F1-score、KS和AUC上全面领先。在风控容忍度允许的范围内,策略B的“多抓坏人”带来的收益通常远大于“多误伤好人”的成本。因此,策略B更适合作为Champion。若业务对误伤极度敏感(如高价值客户场景),则需进一步做利润分析或阈值调优。

3.6 代码实现:混淆矩阵与指标计算

以下Python代码展示了如何从预测结果中快速计算混淆矩阵及所有衍生指标,便于你在实际项目中自动化评估策略效果。

import numpy as np
from sklearn.metrics import confusion_matrix, roc_auc_score

def evaluate_strategy(y_true, y_pred, y_score=None):
    """
    风控策略评估函数
    :param y_true: 真实标签(1=坏,0=好)
    :param y_pred: 预测标签(1=坏,0=好)
    :param y_score: 预测概率(用于计算AUC)
    :return: 指标字典
    """
    tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()
    
    precision = tp / (tp + fp) if (tp + fp) > 0 else 0.0
    recall = tp / (tp + fn) if (tp + fn) > 0 else 0.0
    f1 = 2 * precision * recall / (precision + recall) if (precision + recall) > 0 else 0.0
    
    # 计算KS:按分数排序后累计TPR与FPR的最大差值
    if y_score is not None:
        data = np.column_stack((y_score, y_true))
        data = data[data[:, 0].argsort()[::-1]]  # 按分数降序排列
        total_bad = np.sum(data[:, 1])
        total_good = len(data) - total_bad
        cum_bad = np.cumsum(data[:, 1])
        cum_good = np.cumsum(1 - data[:, 1])
        tpr = cum_bad / total_bad
        fpr = cum_good / total_good
        ks = np.max(tpr - fpr)
        auc = roc_auc_score(y_true, y_score)
    else:
        ks = 0.0
        auc = 0.0
    
    return {
        'TP': tp, 'FP': fp, 'TN': tn, 'FN': fn,
        'Precision': round(precision, 4),
        'Recall': round(recall, 4),
        'F1': round(f1, 4),
        'KS': round(ks, 4),
        'AUC': round(auc, 4)
    }

# 示例用法
y_true = [1, 0, 1, 1, 0, 0, 1, 0]
y_pred = [1, 0, 1, 0, 0, 0, 1, 1]
y_score = [0.9, 0.3, 0.8, 0.4, 0.2, 0.1, 0.7, 0.6]
result = evaluate_strategy(y_true, y_pred, y_score)
print(result)
工程提示:在实际风控系统中,建议将上述函数封装为策略评估流水线的一部分,每次模型迭代或阈值调整后自动输出指标报告,并记录到实验管理平台(如MLflow)中,便于Champion选择的版本追溯。