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 训练/验证集的完整随机切分流程:

随机切分流程:原始数据 → LightGBM 数据集 原始数据集 100% 样本 train_test_split test_size=0.2 | random_state=42 | stratify=y 训练集 (80%) X_train, y_train 测试集 (20%) X_test, y_test lgb.Dataset (训练) lgb.Dataset (验证)

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 参数确保验证集使用训练集的统计量。