📊 数据集划分 · 三剑客

训练·验证·测试

🎯 训练集 · 验证集 · 测试集 核心作用

🏋️

训练集

学习参数 — 模型从这里学习特征与标签的映射,更新权重。

占比最大,通常 60% ~ 80% 。

梯度下降 · 拟合
🔧

验证集

调参 & 早停 — 用于模型选择、超参数调整、防止过拟合。

不参与训练,但指导模型改进。

模型选择 · 正则化
📋

测试集

最终评估 — 仅用于一次性的泛化性能评估,模拟真实场景。

严格隔离,绝不泄露。

精准度 · 泛化

💡 黄金法则: 测试集只能使用一次!验证集可多次使用,但不可用于训练。

📐 经典划分比例 经验法则

数据集典型比例 (小规模)典型比例 (大规模)关键任务
🏋️ 训练集60% – 70%80% – 90%参数学习
🔧 验证集15% – 20%5% – 10%调参 / 早停
📋 测试集15% – 20%5% – 10%最终评估

⚖️ 数据量 < 1万时,常用 60/20/20;数据量 > 10万,可 98/1/1 但验证/测试需足够。

🧬 分层抽样策略 Stratified Split

  • 保持类别比例 — 训练/验证/测试中各类别分布与原始数据集一致。
  • 避免偏差 — 尤其针对不平衡分类(如欺诈检测、罕见病)。
  • 常用工具 — sklearn.model_selection.train_test_split 参数 stratify=y。
  • 回归任务 — 可对目标值分桶后分层抽样。
📊 分层 vs 随机
随机划分 类别比例可能偏移 分层划分 保持原始比例

🐍 Python 分层抽样示例

from sklearn.model_selection import train_test_split
from sklearn.datasets import make_classification

X, y = make_classification(n_samples=1000, weights=[0.9, 0.1], random_state=42)

# 分层抽样 —— 保持类别比例
X_train, X_temp, y_train, y_temp = train_test_split(
    X, y, test_size=0.4, stratify=y, random_state=42)

X_val, X_test, y_val, y_test = train_test_split(
    X_temp, y_temp, test_size=0.5, stratify=y_temp, random_state=42)

print(f'训练集: {y_train.sum()/len(y_train):.2f} 正例占比')
print(f'验证集: {y_val.sum()/len(y_val):.2f} 正例占比')
print(f'测试集: {y_test.sum()/len(y_test):.2f} 正例占比')

🧩 数据集划分流程 架构图

原始数据集 100% 分层抽样 stratify 🏋️ 训练集 60~80% 🔧 验证集 10~20% 📋 测试集 10~20%

✅ 分层抽样确保每个子集类别分布一致,提升模型泛化可信度

📌 实战建议 Tips

📏 比例微调

  • 小数据集 ( < 1k ):考虑 70/15/15 或 80/10/10
  • 大数据集 ( > 100k ):验证/测试可降至 1~5%
  • 交叉验证时,验证集可合并到训练流程

⚠️ 常见陷阱

  • 测试集信息泄露 → 模型“作弊”
  • 忽略分层导致类别不平衡恶化
  • 时间序列数据必须按时间划分