3. 随机划分法:使用 sklearn 的 train_test_split 进行简单随机划分

随机划分法(Simple Random Split)是信用额度定价建模中最基础、最常用的数据划分策略。其核心思想是将原始数据集按照指定的比例,完全随机地拆分为训练集和测试集,不引入任何排序或分层约束。在 Python 生态中,sklearn.model_selection.train_test_split 是执行该操作的标准工具。

3.1 核心原理与适用边界

随机划分法假设样本是独立同分布的,且数据量足够大时,随机抽样能保证训练集与测试集在统计分布上趋于一致。但在信用额度定价场景中,该方法的有效性取决于以下条件:

条件 说明 对信用额度定价的影响
样本量充足 通常要求总样本量 > 10,000 条 大样本下随机波动小,训练/测试分布更接近
目标变量分布均衡 违约/正常客户比例不过度倾斜(如 1:9 以内) 避免测试集中出现极端类别缺失
无强时间依赖 样本采集时间跨度短,或业务策略未发生重大变化 防止时间漂移导致训练集与测试集分布不一致
无群体结构 同一客户不重复出现,或重复样本可独立处理 避免信息泄露(同一客户出现在训练和测试集)
适用场景速查: 随机划分法最适合 初期探索性建模、基线模型建立、以及 数据量 > 50,000 且违约率 > 5% 的信用额度定价任务。当数据量较小或类别极度不平衡时,应优先考虑分层抽样(第4章)。

3.2 代码示例:标准实现流程

以下代码展示了使用 train_test_split 进行信用额度定价数据划分的完整流程,包含特征矩阵与目标变量的拆分、随机种子设置、以及划分后的维度验证。

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_classification

# 模拟信用额度定价数据:10000 样本,20 个特征,违约率约 10%
X, y = make_classification(
    n_samples=10000,
    n_features=20,
    n_informative=15,
    n_redundant=3,
    n_clusters_per_class=1,
    weights=[0.9, 0.1],   # 90% 正常,10% 违约
    random_state=42
)

# 将特征矩阵转为 DataFrame 便于查看
feature_names = [f'feature_{i}' for i in range(20)]
X_df = pd.DataFrame(X, columns=feature_names)
y_series = pd.Series(y, name='default_flag')

# 随机划分:70% 训练集,30% 测试集
X_train, X_test, y_train, y_test = train_test_split(
    X_df,
    y_series,
    test_size=0.3,          # 测试集比例
    random_state=2024,      # 固定随机种子,保证结果可复现
    shuffle=True            # 默认 True,打乱数据顺序
)

# 输出划分结果
print(f"总样本量: {len(X_df)}")
print(f"训练集样本量: {len(X_train)} ({len(X_train)/len(X_df)*100:.1f}%)")
print(f"测试集样本量: {len(X_test)} ({len(X_test)/len(X_df)*100:.1f}%)")
print(f"\n训练集违约率: {y_train.mean():.4f}")
print(f"测试集违约率: {y_test.mean():.4f}")
关键参数说明:
• test_size:测试集比例,常用 0.2~0.4。信用额度定价中推荐 0.3,兼顾模型训练充分性与评估稳定性。
• random_state:随机种子,必须固定。不同种子会导致划分结果不同,影响模型评估的可复现性。
• shuffle:是否打乱数据。默认 True,防止原始数据中的顺序偏差(如按时间排序导致的分布偏移)。

3.3 随机划分的潜在风险与避坑指南

尽管 train_test_split 使用简单,但在信用额度定价的实际业务中,以下三个陷阱需要特别警惕:

  • 陷阱一:信息泄露 — 如果同一客户在数据集中出现多次(如分期还款记录),随机划分可能将该客户的部分记录分入训练集、部分分入测试集,导致模型"提前看到"该客户的还款行为。解决方案:先按客户 ID 去重或分组,再进行划分。
  • 陷阱二:时间穿越 — 信用额度定价通常依赖历史表现数据。如果数据包含时间戳,随机划分可能将较早的样本分入测试集、较晚的样本分入训练集,造成模型用"未来数据"预测"过去"。解决方案:改用时间序列划分(第5章)。
  • 陷阱三:小样本下的分布偏移 — 当总样本量 < 5,000 时,随机划分可能导致训练集与测试集的违约率相差超过 2 个百分点,直接影响额度定价模型的校准。解决方案:使用分层随机划分(第4章)或交叉验证。
⚠️ 业务警示: 在信用额度定价模型中,测试集用于模拟"未来未知客户"的信用表现。如果随机划分导致测试集违约率与训练集偏差超过 1.5 个百分点,建议检查数据是否存在时间趋势或群体结构,并考虑更稳健的划分策略。

3.4 随机划分流程可视化

下图展示了随机划分法在信用额度定价数据上的完整流程,从原始数据集到训练集与测试集的生成,以及后续的模型训练与评估链路。

随机划分法流程:信用额度定价数据划分 原始数据集 10,000 样本 · 20 特征 train_test_split test_size=0.3 · random_state=2024 · shuffle=True 训练集 (70%) 7,000 样本 · 用于模型训练 测试集 (30%) 3,000 样本 · 用于模型评估 模型训练 → 参数调优 模型评估 → 额度定价验证

3.5 随机划分 vs 其他划分方法:快速对比

为了帮助你在信用额度定价项目中快速选择合适的划分策略,下表将随机划分法与后续章节将介绍的分层划分、时间序列划分进行对比:

对比维度 随机划分(本章) 分层随机划分(第4章) 时间序列划分(第5章)
划分依据 完全随机 按目标变量比例分层 按时间顺序
训练/测试分布一致性 大样本下较好 小样本下也能保证 模拟真实时间漂移
代码复杂度 低(1行代码) 中(需指定分层列) 中高(需排序+索引)
信用额度定价推荐度 ★★★☆☆(基线模型) ★★★★★(推荐首选) ★★★★☆(有时序特征时)
典型应用阶段 快速原型、特征筛选 正式建模、额度校准 贷后监控、滚动模型
实践建议: 在信用额度定价的初始探索阶段,使用随机划分法快速建立基线模型;进入正式建模后,切换到分层随机划分以保证测试集能代表各类客户;如果数据包含明确的时间戳(如申请日期、放款日期),务必增加时间序列划分作为稳健性检验。