【漫话机器学习系列】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 进行划分,并可加入 验证集
  • 采用 分层抽样 以保证类别平衡
  • 处理 时间序列数据 时应按时间顺序划分
  • 避免 过拟合数据泄露
  • 采用 交叉验证 提高模型稳定性

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

相关推荐
春末的南方城市21 分钟前
阿里发布新开源视频生成模型Wan-Video,支持文生图和图生图,最低6G就能跑,ComFyUI可用!
人工智能·计算机视觉·自然语言处理·开源·aigc·音视频
ZHOU_WUYI1 小时前
旋转位置编码 (2)
pytorch·python·深度学习
qq_273900231 小时前
AF3 squeeze_features函数解读
人工智能·pytorch·深度学习·生物信息学
ZhuBin3652 小时前
推测gpt4o视觉皮层建立的过程
人工智能·深度学习·计算机视觉
大数据追光猿2 小时前
Qwen 模型与 LlamaFactory 结合训练详细步骤教程
大数据·人工智能·深度学习·计算机视觉·语言模型
何仙鸟2 小时前
深度学习网格搜索实战
人工智能·深度学习
王国强20093 小时前
现代循环神经网络3-深度循环神经网络
深度学习
Wis4e3 小时前
基于PyTorch的深度学习5——神经网络工具箱
pytorch·深度学习·神经网络
闲人编程3 小时前
调试与性能优化技巧
人工智能·pytorch·深度学习
YoseZang4 小时前
【机器学习和深度学习】分类问题通用评价指标:精确率、召回率、准确率和混淆矩阵
深度学习·机器学习·分类算法