3. 训练集与测试集概念:机器学习中训练集、验证集、测试集的定义与风险定价中的严格切分
在风险定价模型中,数据是燃料,但错误的燃料会烧毁引擎。机器学习中的训练集、验证集与测试集是模型开发与评估的三大基石。在金融风控领域,数据的时间序列特性与样本选择偏差使得这三者的切分不再是简单的随机抽样,而是一场关乎模型真实收益与风险暴露的严谨工程。
3.1 三大数据集的精确定义
| 数据集 | 核心用途 | 在风险定价中的角色 | 典型占比 |
|---|---|---|---|
| 训练集 | 模型参数学习与权重更新 | 学习历史借贷行为与违约/收益模式 | 60% – 70% |
| 验证集 | 超参数调优与模型选择 | 防止过拟合,选择最优定价策略阈值 | 10% – 20% |
| 测试集 | 最终模型泛化能力评估 | 模拟真实放贷场景,评估预期收益与风险 | 15% – 20% |
关键区别: 训练集用于“学习”,验证集用于“选择”,测试集用于“证明”。在风险定价中,测试集必须模拟未来放贷的样本分布,否则收益评估将产生严重偏差。
3.2 为什么在风险定价中需要严格切分?
金融数据具有天然的时间依赖性和非平稳性。如果切分不当,模型会“偷看未来”,导致在回测中表现优异,但在实际放贷中亏损惨重。以下是三大核心原因:
- 防止未来信息泄露(Look-ahead Bias)
如果训练集包含未来的样本,模型会学到未来才发生的违约事件,导致定价过低,风险被严重低估。 - 避免过拟合与选择偏差
验证集用于调参,测试集用于最终评估。若三者混用,模型会记住噪声而非真实规律,在真实场景中失效。 - 模拟真实放贷的时间序列结构
风险定价模型通常基于历史放贷数据。严格按时间切分(如训练集用2018-2020年,测试集用2021年)才能模拟模型在“未来”的表现。
常见陷阱: 在风险定价中,切勿使用随机切分(如随机抽取80%作为训练集)。随机切分会将未来的样本混入训练集,导致模型“预知”经济周期变化,收益评估虚高。
3.3 风险定价中的标准切分流程
下图展示了在风险定价场景下,基于时间序列的严格切分流程:
3.4 切分策略对比:随机切分 vs 时间序列切分
| 对比维度 | 随机切分 | 时间序列切分(推荐) |
|---|---|---|
| 数据独立性假设 | 假设样本独立同分布 | 承认时间依赖性 |
| 未来信息泄露风险 | 高(训练集可能包含未来样本) | 低(严格按时间顺序) |
| 收益评估偏差 | 严重高估(模型“预知”未来) | 接近真实放贷场景 |
| 适用场景 | 非时序数据(如静态画像) | 风险定价、信用评分、时序预测 |
实践建议: 在风险定价项目中,建议采用“滚动时间窗口”切分方式。例如:训练集使用过去24个月数据,验证集使用接下来3个月,测试集使用再接下来的3个月。这样可以模拟模型在连续时间上的表现稳定性。
3.5 代码示例:基于时间序列的切分实现
以下Python代码展示了如何在风险定价场景中按时间严格切分数据集:
import pandas as pd
from sklearn.model_selection import TimeSeriesSplit
# 假设df包含历史放贷数据,且已按放贷日期排序
df = pd.read_csv('loan_data.csv')
df['loan_date'] = pd.to_datetime(df['loan_date'])
df = df.sort_values('loan_date')
# 定义切分时间点
train_end = '2020-06-30'
val_end = '2020-09-30'
# 严格按时间切分
train = df[df['loan_date'] <= train_end]
val = df[(df['loan_date'] > train_end) & (df['loan_date'] <= val_end)]
test = df[df['loan_date'] > val_end]
print(f"训练集样本数: {len(train)}")
print(f"验证集样本数: {len(val)}")
print(f"测试集样本数: {len(test)}")
# 使用TimeSeriesSplit进行交叉验证(可选)
tscv = TimeSeriesSplit(n_splits=3)
for train_idx, test_idx in tscv.split(train):
# 在训练集内部进行时间序列交叉验证
pass
核心原则: 在风险定价中,测试集必须代表模型将要部署的未来时间段。如果测试集的时间段早于训练集,那么收益评估将毫无意义。始终记住:时间不可逆,数据切分必须尊重时间顺序。