1. 概述

在机器学习中,数据归一化(Normalization)是一种非常常见的预处理技术,能够显著提升模型的训练效率和预测性能。然而,一个常被忽视的问题是:我们究竟应该在划分训练集和测试集之前进行归一化,还是在之后进行?

这个问题看似简单,但如果不注意处理顺序,很容易引入数据泄漏(Data Leakage),从而导致模型评估结果出现偏差。

在本文中,我们将:

  • 回顾什么是数据归一化
  • 解释为什么需要划分训练集和测试集
  • 分析归一化与划分顺序的关系
  • 给出推荐的正确操作流程

2. 数据归一化简介

2.1. 什么是归一化?

归一化是对模型特征进行缩放处理的一种方式,目的是让不同量纲的特征在数值上具有可比性,从而加快模型收敛速度、提升模型性能。

常见的归一化方法包括:

Min-Max 归一化(Rescaling):将数据缩放到 [0, 1] 区间
公式:
$$ z = \frac{x - \min(x)}{\max(x) - \min(x)} $$

均值归一化(Mean Normalization):将数据缩放到 [-0.5, 0.5] 区间
公式:
$$ z = \frac{x - \bar{x}}{\max(x) - \min(x)} $$

标准化(Standardization):将数据转换为均值为 0、标准差为 1 的分布
公式:
$$ z = \frac{x - \bar{x}}{\sigma} $$

⚠️ 注意:标准化并不强制数据服从正态分布,但很多模型(如 SVM、逻辑回归)在这种情况下表现更好。

2.2. 归一化参数的双向使用

归一化过程中使用的参数(如 min、max、mean、标准差)不仅在训练阶段重要,在模型部署阶段也同样关键:

  • 输入处理:新数据必须使用训练阶段的参数进行归一化
  • 输出还原:模型输出的是归一化后的结果,需用训练参数还原为原始尺度

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

划分数据集的核心目的是为了获得对模型性能的无偏估计

训练集用于:

  • ✅ 拟合模型参数(如神经网络中的权重)

测试集用于:

  • ✅ 独立评估模型性能,模拟模型上线后面对的新数据

❌ 如果我们在训练阶段“偷偷”使用了测试集的信息,模型就会“作弊”,导致评估结果虚高。


4. 归一化应该在划分之前还是之后?

4.1. 如果在划分前归一化?

假设我们先对整个数据集做 Min-Max 归一化,再划分训练集和测试集:

  • ✅ 测试集数据的归一化值都在 [0, 1] 范围内
  • ❌ 但我们已经把测试集的 min 和 max 信息“泄露”给了训练过程

这会导致什么问题?

  • ✅ 模型在测试集上表现可能更好
  • ❌ 但这只是因为模型“提前知道”了测试集的分布信息,评估结果不再可靠

⚠️ 这就是典型的数据泄漏问题,必须避免。


5. 正确做法:归一化应在划分之后

推荐的操作流程如下:

✅ 训练阶段

  1. 先划分训练集和测试集
  2. 仅使用训练集计算归一化参数(min、max、mean、std)
  3. 保存这些参数供后续使用

✅ 预测阶段

  1. 使用训练集参数对新数据进行归一化
  2. 输入模型进行预测
  3. 使用相同参数将预测结果还原为原始尺度

✅ 评估阶段

  1. 对测试集进行归一化(使用训练集参数)
  2. 得到预测结果
  3. 与原始测试集进行比较,计算评估指标

这样做可以确保:

  • ✅ 测试集完全独立于训练过程
  • ✅ 模型评估结果更真实、可靠

6. 小结

  • ✅ 数据归一化是提升模型性能的重要手段
  • ✅ 划分训练集和测试集是为了获得无偏的模型评估
  • ❌ 在划分前归一化会导致数据泄漏,影响评估准确性
  • ✅ 正确做法是:先划分,再归一化,且归一化参数仅来自训练集

💡 小贴士:在实际项目中,建议将归一化参数保存下来(如 JSON 文件),以便在部署模型时使用。


📌 参考资料:
如果你对数据预处理还有兴趣,可以进一步阅读以下内容:

  • 特征缩放(Feature Scaling)详解
  • Scikit-learn 中的 StandardScalerMinMaxScaler 使用技巧
  • 如何防止机器学习中的数据泄漏(Data Leakage)

原始标题:Data Normalization Before or After Splitting a Data Set?