4. 随机切分实战:使用 train_test_split 进行 LightGBM 数据划分
在信贷额度策略开发中,随机切分是最基础、最常用的数据划分方式。它假设样本独立同分布,通过随机打乱将数据集按比例拆分为训练集和测试集。本节将结合 LightGBM 的实际建模流程,演示如何使用 train_test_split 完成数据划分,并验证切分后的数据分布一致性。
4.1 核心函数与参数
sklearn.model_selection.train_test_split 是执行随机切分的核心 API。下表列出了在额度策略场景中最常用的参数及其推荐配置:
| 参数 | 说明 | 额度策略推荐值 |
|---|---|---|
test_size |
测试集占比(0~1 浮点数)或绝对样本数(整数) | 0.2 ~ 0.3 |
train_size |
训练集占比,与 test_size 互斥 | 0.7 ~ 0.8 |
random_state |
随机种子,保证切分结果可复现 | 42 或 2024 |
shuffle |
是否在切分前打乱数据 | True(默认) |
stratify |
按指定列分层抽样,保持类别比例 | 目标变量 y(分类任务) |
💡 实践要点:在额度策略中,
random_state 必须固定,否则每次运行模型结果不可复现,导致策略回测失效。stratify 参数在目标变量为二分类(如“是否逾期”)时尤其重要,可防止因随机波动导致训练集或测试集中坏样本比例失真。
4.2 实战代码:标准随机切分流程
以下代码演示了从加载数据到完成 LightGBM 数据切分的完整步骤:
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
import lightgbm as lgb
# 1. 加载样本数据(假设已清洗完毕)
df = pd.read_csv('credit_data.csv')
X = df.drop(columns=['target', 'user_id'])
y = df['target']
# 2. 执行随机切分:80% 训练,20% 测试
X_train, X_test, y_train, y_test = train_test_split(
X, y,
test_size=0.2,
random_state=42,
stratify=y # 保持正负样本比例一致
)
# 3. 创建 LightGBM 数据集
lgb_train = lgb.Dataset(X_train, y_train)
lgb_valid = lgb.Dataset(X_test, y_test, reference=lgb_train)
# 4. 训练参数(额度策略典型配置)
params = {
'objective': 'binary',
'metric': 'auc',
'boosting_type': 'gbdt',
'num_leaves': 31,
'learning_rate': 0.05,
'feature_fraction': 0.8,
'seed': 42
}
# 5. 训练模型
model = lgb.train(
params,
lgb_train,
valid_sets=[lgb_train, lgb_valid],
valid_names=['train', 'valid'],
num_boost_round=100,
callbacks=[lgb.early_stopping(10), lgb.log_evaluation(10)]
)
⚠️ 关键检查点:切分后务必检查
y_train 和 y_test 中正样本(逾期/坏客户)的比例是否与原始数据集基本一致。若差异超过 0.5%,说明随机种子或分层参数需要调整。
4.3 随机切分流程可视化
下图展示了从原始数据集到 LightGBM 训练/验证集的完整随机切分流程:
4.4 切分后数据分布验证
随机切分后,必须验证训练集和测试集在关键特征上的分布是否一致。以下代码输出分布对比:
# 验证目标变量分布
print("原始数据集正样本比例: {:.4f}".format(y.mean()))
print("训练集正样本比例: {:.4f}".format(y_train.mean()))
print("测试集正样本比例: {:.4f}".format(y_test.mean()))
# 验证关键特征分布(以额度使用率为例)
feature = 'credit_utilization'
print("\n特征 '{}' 分布对比:".format(feature))
print("训练集均值: {:.4f} | 标准差: {:.4f}".format(
X_train[feature].mean(), X_train[feature].std()))
print("测试集均值: {:.4f} | 标准差: {:.4f}".format(
X_test[feature].mean(), X_test[feature].std()))
🚨 常见陷阱:如果训练集和测试集在某个重要特征(如“近 6 个月逾期次数”)上的均值差异超过 0.1 个标准差,说明随机切分可能引入了分布偏移。此时应检查:① 样本量是否过小(< 5000);② 是否忘记设置
stratify;③ 数据中是否存在时间依赖结构(此时应改用时间序列切分)。
4.5 随机切分 vs. 其他切分方法
在额度策略开发中,随机切分并非万能。下表对比了它与后续章节将介绍的其他切分方法的适用场景:
| 切分方法 | 适用场景 | 优点 | 局限性 |
|---|---|---|---|
| 随机切分 | 离线实验、A/B 测试模拟、特征筛选 | 实现简单、可复现、支持分层 | 忽略时间顺序,不适用于时序数据 |
| 时间序列切分 | 贷后监控、滚动策略验证 | 保留时间因果顺序 | 样本量随时间递减 |
| 分组切分 | 同一用户多笔借款场景 | 防止用户信息泄露 | 组大小不均时切分比例难控制 |
| 分层切分 | 样本不平衡严重的风控场景 | 保持各层比例一致 | 层数过多时部分层样本过少 |
4.6 本节要点总结
- 固定随机种子:
random_state是策略可复现的生命线,建议在项目配置文件中统一管理。 - 分层抽样优先:在二分类风控任务中,始终使用
stratify=y防止目标变量分布偏移。 - 验证分布一致性:切分后至少检查目标变量和 2~3 个核心特征的均值与标准差。
- 警惕数据泄露:随机切分假设样本独立,若数据包含同一用户的多次借贷记录,应改用分组切分。
- LightGBM 数据集创建:使用
lgb.Dataset封装训练集和验证集,并设置reference参数确保验证集使用训练集的统计量。