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 强预测力,需注意过拟合
WOE编码与分箱流程 原始变量 分箱(Binning) WOE计算 IV筛选 分箱方法选择: • 等频分箱:每箱样本数相等,适合长尾分布 • 卡方分箱:基于卡方检验合并相邻区间,保证箱内目标分布一致性 • 决策树分箱:利用单变量决策树寻找最优分裂点,自动化程度高 • 缺失值单独成箱,避免信息丢失

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)。

模型训练与序列化保存流程 特征工程 模型训练 pickle保存 ONNX导出 格式对比: • pickle:Python原生,简单易用,但跨语言困难,版本兼容性差 • ONNX:开放标准,支持跨语言(Java/C++/Go)、跨平台(CPU/GPU),推理优化友好 • 生产建议:开发阶段用pickle快速迭代,上线Serving用ONNX保证性能与兼容性

3.4 本章小结

  • 逻辑回归与XGBoost在风控中各有定位:前者用于可解释评分卡,后者用于高精度反欺诈。
  • WOE编码与分箱是逻辑回归建模的必备步骤,IV值用于特征筛选。
  • 模型保存推荐双轨策略:开发阶段使用pickle快速迭代,生产Serving使用ONNX格式保证跨平台与推理性能。
  • 特征工程的质量直接决定模型上限,务必在分箱与WOE编码阶段进行充分的业务逻辑校验。