3. 评分模型基础回顾:逻辑回归与XGBoost原理、模型训练与保存(pickle/ONNX格式)、特征工程要点(WOE编码、分箱)
在风控评分卡与机器学习模型Serving部署之前,必须扎实掌握模型构建的核心环节。本章将系统回顾逻辑回归与XGBoost的数学原理、训练与序列化保存流程,以及特征工程中WOE编码与分箱的关键技术。这些内容是后续模型上线与监控的理论基石。
3.1 逻辑回归与XGBoost原理对比
逻辑回归(Logistic Regression)与XGBoost是风控领域最常用的两类模型。前者以高可解释性见长,是评分卡的标准载体;后者以高精度与特征交互能力著称,常用于复杂欺诈识别。
| 对比维度 | 逻辑回归 | XGBoost |
|---|---|---|
| 模型类型 | 广义线性模型(GLM) | 梯度提升决策树(GBDT) |
| 输出形式 | 概率值 p(y=1|x),经Sigmoid映射 | 多棵决策树叶子权重累加,经Sigmoid映射 |
| 损失函数 | 交叉熵(Log Loss) | 二阶泰勒展开近似 + 正则项 |
| 特征处理 | 需WOE编码、分箱、线性化 | 可接受原始数值/类别,自动分裂 |
| 可解释性 | 高(权重直接对应特征贡献) | 中(需SHAP/PDP辅助解释) |
| 训练速度 | 快(梯度下降/牛顿法) | 中等(需调参,支持GPU加速) |
| 过拟合控制 | L1/L2正则化 | 学习率、树深度、subsample、列采样 |
| 风控典型用途 | 标准评分卡、监管合规场景 | 反欺诈、高维非线性风险识别 |
核心要点: 逻辑回归要求特征与log-odds呈线性关系,因此必须通过WOE编码与分箱将原始变量转化为单调或分段线性特征;XGBoost则通过树结构自动捕捉非线性与交互,对特征工程要求较低,但模型文件更大,Serving时需更关注延迟。
3.2 特征工程要点:WOE编码与分箱
特征工程是评分卡建模的“灵魂”。WOE(Weight of Evidence)编码与分箱(Binning)将原始变量转化为具有业务含义且满足线性假设的输入。
3.2.1 分箱(Binning)
分箱将连续变量或高基数离散变量划分为若干区间(箱),目的是平滑噪声、捕捉非线性、保证单调性。常用方法包括等距分箱、等频分箱、卡方分箱、决策树分箱。
- 等频分箱: 每个箱包含相同数量的样本,适合长尾分布。
- 等距分箱: 每个箱的数值区间宽度相同,对异常值敏感。
- 卡方分箱: 基于卡方检验合并相邻区间,保证箱内目标分布一致性。
- 决策树分箱: 利用单变量决策树寻找最优分裂点,自动化程度高。
3.2.2 WOE编码
WOE衡量每个分箱中“好客户”与“坏客户”分布的差异,公式如下:
WOE_i = ln( (坏样本占比_i) / (好样本占比_i) )
其中,坏样本占比_i = 箱i中坏样本数 / 总坏样本数;好样本占比_i = 箱i中好样本数 / 总好样本数。WOE值越大,表示该箱中坏样本相对集中程度越高(风险越高)。
WOE编码三大优势: (1) 将非线性关系线性化,适配逻辑回归;(2) 统一量纲,使不同特征的系数可直接比较;(3) 缺失值可单独成箱,天然处理缺失。
3.2.3 IV值(Information Value)
IV值用于评估特征对目标变量的区分能力,是分箱与WOE编码后的重要筛选指标:
IV = Σ (坏样本占比_i - 好样本占比_i) * WOE_i
| IV值范围 | 预测能力 |
|---|---|
| < 0.02 | 无预测力,建议剔除 |
| 0.02 ~ 0.10 | 弱预测力 |
| 0.10 ~ 0.30 | 中等预测力 |
| > 0.30 | 强预测力,需注意过拟合 |
3.3 模型训练与保存(pickle / ONNX格式)
模型训练完成后,必须将其序列化为标准格式,以便后续Serving部署。pickle是Python原生格式,简单易用但跨语言困难;ONNX(Open Neural Network Exchange)是开放标准,支持跨平台、跨语言推理。
3.3.1 逻辑回归训练与pickle保存
import pickle
from sklearn.linear_model import LogisticRegression
# 假设 X_train_woe 为WOE编码后的特征矩阵,y_train 为标签
lr_model = LogisticRegression(C=1.0, penalty='l2', solver='lbfgs', max_iter=1000)
lr_model.fit(X_train_woe, y_train)
# 保存为pickle格式
with open('lr_scorecard.pkl', 'wb') as f:
pickle.dump(lr_model, f)
# 加载模型
with open('lr_scorecard.pkl', 'rb') as f:
lr_model_loaded = pickle.load(f)
3.3.2 XGBoost训练与pickle保存
import pickle
import xgboost as xgb
# 假设 X_train 为原始特征(或WOE特征),y_train 为标签
xgb_model = xgb.XGBClassifier(
n_estimators=100, max_depth=4, learning_rate=0.1,
subsample=0.8, colsample_bytree=0.8, reg_lambda=1.0,
eval_metric='logloss', use_label_encoder=False
)
xgb_model.fit(X_train, y_train)
# 保存为pickle格式
with open('xgb_model.pkl', 'wb') as f:
pickle.dump(xgb_model, f)
# 加载模型
with open('xgb_model.pkl', 'rb') as f:
xgb_model_loaded = pickle.load(f)
3.3.3 模型导出为ONNX格式
ONNX格式可实现跨平台推理(如Java、C++、Go),且支持推理优化(如TensorRT、ONNX Runtime)。
from skl2onnx import convert_sklearn
from skl2onnx.common.data_types import FloatTensorType
# 逻辑回归转ONNX
initial_type = [('float_input', FloatTensorType([None, X_train_woe.shape[1]]))]
lr_onnx = convert_sklearn(lr_model, initial_types=initial_type)
with open('lr_scorecard.onnx', 'wb') as f:
f.write(lr_onnx.SerializeToString())
# XGBoost转ONNX(需安装 onnxmltools)
import onnxmltools
from onnxmltools.convert import convert_xgboost
xgb_onnx = convert_xgboost(xgb_model, initial_types=initial_type)
with open('xgb_model.onnx', 'wb') as f:
f.write(xgb_onnx.SerializeToString())
ONNX导出注意事项: (1) 确保模型版本与ONNX转换器版本兼容;(2) 对于XGBoost,需指定特征维度与类型;(3) 转换后建议使用ONNX Runtime进行推理验证,确保精度损失在可接受范围内(通常<1e-6)。
3.4 本章小结
- 逻辑回归与XGBoost在风控中各有定位:前者用于可解释评分卡,后者用于高精度反欺诈。
- WOE编码与分箱是逻辑回归建模的必备步骤,IV值用于特征筛选。
- 模型保存推荐双轨策略:开发阶段使用pickle快速迭代,生产Serving使用ONNX格式保证跨平台与推理性能。
- 特征工程的质量直接决定模型上限,务必在分箱与WOE编码阶段进行充分的业务逻辑校验。