用GBM预测信用卡逾期?手把手教你从数据清洗到模型上线的完整Pipeline(附Python代码)
用GBM预测信用卡逾期?手把手教你从数据清洗到模型上线的完整Pipeline(附Python代码)
金融风控领域的数据科学家们每天都在与数据博弈,而信用卡逾期预测无疑是其中最富挑战性的任务之一。想象一下,当你手头的逾期样本占比不足1%,业务部门却要求模型既能精准捕捉高风险用户,又不能误伤优质客户——这就是典型的类别不平衡问题。本文将带你从原始数据出发,一步步构建可解释的GBM模型,最终将其封装为可实时调用的API服务。
1. 数据清洗:从原始数据到特征矩阵
拿到银行提供的脱敏数据集后,你会发现现实中的数据远比教科书复杂。我们的示例数据集包含以下典型问题:
- 30%的消费记录存在缺失值
- 时间格式不统一(有的用Unix时间戳,有的用字符串"YYYY/MM/DD")
- 同一用户的交易记录分散在多个CSV文件中
# 时间格式标准化示例 import pandas as pd def parse_time(col): try: return pd.to_datetime(col, unit='s') # 处理Unix时间戳 except ValueError: return pd.to_datetime(col, format='%Y/%m/%d') # 处理字符串日期 transactions['time'] = transactions['timestamp'].apply(parse_time)处理类别不平衡的实用技巧:
- 过采样少数类时采用SMOTE-ENN组合策略
- 欠采样多数类时保留业务价值高的样本(如大额消费用户)
- 在模型层面调整class_weight参数
注意:滚动时间窗口统计是金融风控的特征工程核心。建议计算每个用户最近30/60/90天的:
- 平均消费金额
- 最大单笔消费
- 夜间消费占比
- 还款延迟天数
2. 特征工程:构建业务导向的特征体系
单纯的原始特征很难反映用户真实风险状况。我们需要构建具有业务解释性的衍生特征:
| 特征类型 | 计算逻辑示例 | 业务意义 |
|---|---|---|
| 消费稳定性 | 近3个月消费金额标准差 | 识别异常消费模式 |
| 还款及时性 | 历史平均还款延迟小时数 | 评估用户还款意愿 |
| 额度使用率 | 当前余额/信用额度 | 反映资金压力 |
| 跨境消费占比 | 境外消费次数/总消费次数 | 评估消费场景风险 |
# 滚动窗口特征计算示例 def rolling_features(df, window='30D'): return df.set_index('time').groupby('user_id').rolling(window).agg({ 'amount': ['mean', 'max', 'std'], 'is_night': 'mean' })特征选择的关键指标:
- 特征重要性排名(基于GBM内置计算)
- 特征间相关性热图
- 业务可解释性评估
3. 模型训练:可解释的GBM实现
使用LightGBM的实践表明,以下参数组合在逾期预测中表现优异:
import lightgbm as lgb params = { 'objective': 'binary', 'metric': 'auc', 'boosting_type': 'gbdt', 'learning_rate': 0.05, 'num_leaves': 31, 'min_child_samples': 100, 'feature_fraction': 0.8, 'bagging_freq': 1, 'scale_pos_weight': 99 # 应对1:99的类别不平衡 } lgb_train = lgb.Dataset(X_train, y_train) model = lgb.train(params, lgb_train, valid_sets=[lgb_val])模型解释性工具对比:
| 工具 | 优势 | 适用场景 |
|---|---|---|
| SHAP | 全局和局部解释统一框架 | 向业务部门展示个案分析 |
| LIME | 对复杂模型友好 | 快速验证特征影响 |
| 特征重要性 | 直观易理解 | 初步特征筛选 |
# SHAP值计算示例 import shap explainer = shap.TreeExplainer(model) shap_values = explainer.shap_values(X_test) shap.summary_plot(shap_values, X_test)4. 模型部署:构建实时预测API
将训练好的模型封装为API服务时,需要考虑以下生产环境要素:
- 输入数据验证(Pydantic模型)
- 模型版本管理(MLflow)
- 性能监控(Prometheus指标)
# FastAPI服务核心代码 from fastapi import FastAPI from pydantic import BaseModel app = FastAPI() class UserData(BaseModel): user_id: str features: dict @app.post("/predict") async def predict(data: UserData): df = pd.DataFrame([data.features]) proba = model.predict(df)[0] return {"user_id": data.user_id, "default_prob": float(proba)}部署 checklist:
- 压力测试:使用Locust模拟并发请求
- 容器化:构建Docker镜像时注意:
- 基础镜像选择(推荐python:3.8-slim)
- 模型文件挂载方式
- 健康检查端点设计
- 日志收集:ELK栈配置
5. 持续优化:模型监控与迭代
上线只是开始,我们需要建立完整的监控闭环:
- 数据漂移检测:每月计算PSI(Population Stability Index)
- 预测结果分析:建立逾期概率分布直方图
- 业务反馈整合:将误判案例加入训练集
# PSI计算函数 def calculate_psi(expected, actual, bins=10): breakpoints = np.percentile(expected, np.linspace(0,100,bins+1)) expected_perc = np.histogram(expected, breakpoints)[0]/len(expected) actual_perc = np.histogram(actual, breakpoints)[0]/len(actual) return np.sum((expected_perc - actual_perc) * np.log(expected_perc/actual_perc))实际项目中我们发现,当PSI超过0.25时模型准确率会下降15%以上,这时就需要触发重新训练流程。建议设置自动化监控任务,每周生成模型健康报告。
