【漫话机器学习系列】128.预处理之训练集与测试集(Preprocessing Traning And Test Sets)

预处理之训练集与测试集

在机器学习任务中,数据预处理是至关重要的步骤,而**训练集(Training Set)和测试集(Test Set)**的划分是预处理中最基础的部分。正确地划分数据集可以有效评估模型的泛化能力,并避免模型在新数据上的表现不佳。本文将详细介绍训练集和测试集的作用、划分方法、常见问题及优化策略。


1. 为什么要划分训练集和测试集?

在构建机器学习模型时,我们希望模型能够在未知数据上表现良好,而不仅仅是在已知数据上达到高精度。因此,我们通常将数据集划分为不同的部分:

  1. 训练集(Training Set):用于训练模型,使模型能够学习数据中的特征和模式。
  2. 测试集(Test Set):用于评估模型的泛化能力,判断其在未见过的数据上的表现。

如果不进行合理划分,直接用同一批数据训练和测试,可能会导致过拟合(Overfitting),即模型在训练数据上表现良好,但在新数据上表现较差。


2. 训练集与测试集的划分方法

2.1 常见的划分比例

在实际应用中,训练集和测试集的常见划分比例如下:

  • 80% 训练集,20% 测试集(常见)
  • 70% 训练集,30% 测试集(适用于数据较多的情况)
  • 90% 训练集,10% 测试集(适用于数据较少的情况)

此外,还可以引入**验证集(Validation Set)**进行模型调优,使得划分变为:

  • 训练集(60%-80%):用于训练模型
  • 验证集(10%-20%):用于调整超参数和优化模型
  • 测试集(10%-20%):用于最终评估模型

2.2 具体的划分方式

在 Python 机器学习框架(如 scikit-learn)中,我们可以使用 train_test_split() 进行数据划分:

python 复制代码
from sklearn.model_selection import train_test_split

# 假设我们有一个数据集 X(特征)和 y(标签)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

print("训练集大小:", len(X_train))
print("测试集大小:", len(X_test))
  • test_size=0.2:表示 20% 的数据用于测试集
  • random_state=42:固定随机种子,确保结果可复现

3. 训练集和测试集划分的策略

3.1 随机划分(Random Split)

最常见的方法是随机划分数据,适用于数据分布均匀的情况。但如果数据分布不均,可能导致训练集和测试集的类别比例失衡。

3.2 分层抽样(Stratified Sampling)

如果数据集的类别分布不均(如二分类问题中,类别 A 占 90%,类别 B 仅占 10%),使用 StratifiedShuffleSplit 进行分层抽样,确保训练集和测试集中的类别比例一致:

python 复制代码
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, stratify=y, random_state=42)
  • stratify=y:确保数据按照 y 的类别进行分层抽样,防止某些类别在测试集中缺失。

3.3 时间序列数据的划分

如果数据具有时间相关性(如股票价格、天气预测),则不能随机划分,而应该按照时间顺序划分:

  • 训练集:过去的数据(如 2010-2019 年的数据)
  • 测试集:最近的数据(如 2020 年的数据)

示例代码:

python 复制代码
train_size = int(len(df) * 0.8)  # 80% 用于训练
train, test = df[:train_size], df[train_size:]

3.4 交叉验证(Cross-Validation)

在数据较少的情况下,我们可以使用交叉验证 ,如 K 折交叉验证(K-Fold Cross Validation),通过多次训练和测试提高模型的稳定性:

python 复制代码
from sklearn.model_selection import KFold

kf = KFold(n_splits=5, shuffle=True, random_state=42)
for train_index, test_index in kf.split(X):
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]

这样,每个数据点都有机会成为训练集和测试集,减少数据划分的随机性对结果的影响。


4. 训练集和测试集划分的常见问题

4.1 过拟合(Overfitting)

如果模型在训练集上表现很好,但在测试集上表现差,说明模型可能过拟合了训练数据。常见解决方案:

  • 增加训练数据
  • 使用正则化(L1/L2 正则)
  • 采用交叉验证
  • 降低模型复杂度(如减少神经网络层数)

4.2 数据泄露(Data Leakage)

数据泄露是指测试集中的数据在训练过程中被模型提前"看到",导致测试结果不真实。例如:

  • 在训练前计算整个数据集的均值/标准化
  • 在数据增强时使用了测试集数据
  • 目标变量(y)泄露到特征中

解决方案:

  • 确保所有预处理步骤仅对训练集执行,再应用到测试集
  • 使用 train_test_split() 进行数据划分后再进行特征工程
  • 采用时间序列拆分(如股市预测时,不能用未来数据训练模型)

4.3 测试集的分布与真实世界不匹配

有时候测试集的数据分布与实际应用场景不符,例如:

  • 训练数据采集于城市,而测试数据来自农村
  • 训练数据基于特定时间段,而测试数据是全新的数据

此时,建议使用分布一致的数据集 ,或者采用**领域自适应(Domain Adaptation)**方法来解决问题。


5. 结论

在机器学习的预处理中,合理划分训练集和测试集至关重要:

  • 训练集 用于模型学习,测试集用于模型评估
  • 一般按 80/20 或 70/30 进行划分,并可加入 验证集
  • 采用 分层抽样 以保证类别平衡
  • 处理 时间序列数据 时应按时间顺序划分
  • 避免 过拟合数据泄露
  • 采用 交叉验证 提高模型稳定性

在实际应用中,合理选择数据划分方式,可以有效提高模型的泛化能力,使其更好地适用于真实场景。

相关推荐
梯度下降中3 小时前
LoRA原理精讲
人工智能·算法·机器学习
剑穗挂着新流苏3123 小时前
203_深度学习的第一步:线性回归模型与 SGD 优化算法实战
人工智能·深度学习·机器学习
是枚小菜鸡儿吖4 小时前
卷不动了?带你拆解 2026 深度学习核心版图:CNN、Transformer 与扩散模型的实战进化
深度学习·cnn·transformer
靴子学长4 小时前
Decoder only 架构下 - KV cache 的理解
pytorch·深度学习·算法·大模型·kv
刘简爱学习4 小时前
弱监督互斥多类脑肿瘤图像分割的类间可分离性损失
人工智能·深度学习·计算机视觉
2301_764441335 小时前
AI动态编排革命:Skill与Dify工作流终极对决
人工智能·机器学习
程序员Shawn5 小时前
【机器学习 | 第五篇】- 决策树
人工智能·决策树·机器学习
bug大湿5 小时前
语音模型流式结构修改要点
深度学习·自然语言处理·语音识别
AI-Ming6 小时前
程序员转行学习 AI 大模型: 踩坑记录:服务器内存不够,程序被killed
服务器·人工智能·python·gpt·深度学习·学习·agi
龙腾AI白云6 小时前
如何利用知识图谱实现推理和计算
人工智能·深度学习·语言模型·自然语言处理·数据分析