在金融风控领域,评估模型性能从来不是简单看准确率就能下结论的事。最近处理一个信贷违约预测项目时,我系统对比了四种机器学习模型的评估指标,特别是深入分析了它们的ROC曲线和PR曲线表现。这个过程中发现不少有意思的结论,尤其当数据存在明显类别不平衡时(正常客户远多于违约客户),这两个曲线的解读方式会直接影响模型选择。
先看数据基本情况:原始数据集包含约30个特征,包括客户职业年限、房屋所有权状况、贷款用途等。经过预处理后,最终得到78维特征(包含独热编码产生的新特征)。训练集测试集按8:2划分,类别分布显示违约客户占比约22%,属于典型的不平衡数据场景。
关键提示:在金融风控中,我们通常更关注召回率(抓出多少真正的违约客户)和精确率(预测为违约的客户中有多少真违约),而不是单纯的准确率。这就是为什么需要同时看ROC和PR曲线。
ROC曲线的横轴是假正率(FPR),即把好客户误判为坏客户的比例;纵轴是真正率(TPR),也就是召回率。一个好的模型,其ROC曲线应该尽可能向左上角凸起。曲线下面积AUC越接近1,说明模型区分能力越强。
但实践中我发现一个陷阱:当负样本(好客户)数量远多于正样本时,即使FPR看起来很低,对应的误判绝对数量可能仍然不可接受。比如在我们的数据中,SVM模型的FPR为0.18看似不高,但乘以庞大的好客户基数后,会导致大量优质客户被错误拒绝。
PR曲线的横轴是召回率,纵轴是精确率。它特别适合评估不平衡数据下的模型表现。当正样本很少时,随机猜测的PR曲线会是一条水平线(正样本占比),而好模型应该尽可能向右上角凸起。
实测数据显示,当违约客户占比仅22%时:
python复制# 类别型特征处理示例
home_ownership_mapping = {
'Own Home': 1,
'Rent': 2,
'Have Mortgage': 3
}
data['Home Ownership'] = data['Home Ownership'].map(home_ownership_mapping)
# 连续特征处理
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
特别注意:
python复制# LightGBM最优配置
lgb_model = LGBMClassifier(
n_estimators=150, # 比默认100稍大
max_depth=6, # 防止过拟合
learning_rate=0.05, # 配合更多树
reg_alpha=0.1, # L1正则
reg_lambda=0.1, # L2正则
random_state=42
)
对比发现:
| 模型 | 准确率 | 精确率 | 召回率 | F1 | ROC-AUC | PR-AP |
|---|---|---|---|---|---|---|
| XGBoost | 0.872 | 0.752 | 0.681 | 0.715 | 0.891 | 0.698 |
| SVM | 0.821 | 0.643 | 0.592 | 0.616 | 0.832 | 0.351 |
| LightGBM | 0.885 | 0.781 | 0.703 | 0.740 | 0.903 | 0.723 |
| KNN | 0.843 | 0.692 | 0.634 | 0.662 | 0.851 | 0.542 |
关键发现:
ROC曲线通常用于选择平衡误判成本的阈值。在我们的信贷场景中:
假设FP成本是FN成本的1/5,则应选择使得TPR/(5*FPR)最大的阈值。
python复制# 阈值选择示例
fpr, tpr, thresholds = roc_curve(y_test, lgb_pred_proba)
best_idx = np.argmax(tpr - 5*fpr) # 自定义代价敏感指标
best_threshold = thresholds[best_idx]
当更关注正类识别时(如欺诈检测),PR曲线比ROC更有参考价值。我们发现:
这意味着使用LightGBM,在捕获80%违约客户的同时,只有35%的好客户会被错误拒绝,业务上更可接受。
数据不平衡处理:
特征工程教训:
生产环境考量:
最终我们选择LightGBM部署到生产环境,通过调整阈值将误判率控制在业务可接受范围内。上线三个月后,相比旧系统,新模型的坏账识别率提升40%,同时减少25%的好客户误拒。这个案例再次证明,在金融风控领域,选择合适的评估指标和可视化工具,往往比模型本身的选择更重要。