Skip to content

随机划分何时对机器学习模型是致命的?

When is Random Splitting Fatal for ML Models?

在几乎所有的机器学习(ML)入门课程中,我们都会听到这样一条建议:把给定的数据随机划分(random splitting)成训练集和验证集。

ds p394 1

随机划分之所以合理,是因为它能确保数据在划分时不带任何偏差。然而,我遇到过许多随机划分对模型构建(model building)来说是致命的情形。可很多人并没有意识到这一点。而且我这里说的并不是时间序列(time series)数据集。

假设你正在构建一个为图像生成字幕(caption)的模型。

ds p394 2

由于语言本身的特性,同一张图像可以对应许多不同的字幕:

ds p395 1

现在你大概能想到,如果我们把这个数据集随机划分成训练集和验证集会发生什么。在随机划分时,同一个数据点(图像)会同时出现在训练集和验证集中。

ds p395 2

这就是典型的数据泄露(data leakage)案例,会导致严重的过拟合(overfitting)!这种泄露也被称为组泄露(group leakage)。

从上面的讨论可以看出,随机划分正是问题的根源。组随机划分(group shuffle split)能帮我们解决这个问题。

具体分两步:

  • 把对应于同一张图像(或可能导致泄露的特征,或任何其他分组依据)的所有训练样本归为一组。
  • 分组之后,整个组必须被随机地整体放入训练集或验证集。
  • 这样就能避免我们前面看到的组泄露,从而防止过拟合。这里需要注意一点:在上面的例子中,数据集里的所有特征(即图像像素)都参与了分组依据。但更一般地说,可能只有一部分特征需要在数据划分时被归到同一组。举例来说,考虑一个包含医学影像数据的数据集,每个样本由多张图像组成(例如同一患者身体部位的不同视角),模型的目标是检测疾病的严重程度。在这种情况下,必须把同一患者的所有图像归为一组,再进行数据划分。否则就会导致数据泄露,模型也无法很好地泛化到新患者身上。

ds p396 1

如果你使用 Sklearn,GroupShuffleSplit 实现了这一思路。

ds p397 1

假设我们有如下数据集:

ds p397 2

  • x1 和 x2 是特征(feature)。
  • y 是目标变量。
  • group 表示分组依据。

首先,我们从 sklearn 导入 GroupShuffleSplit 并实例化该对象:

ds p397 3

该对象的 split 方法让我们可以执行组划分:

ds p398 1

它会返回一个生成器,我们可以将其解包得到如下输出:

ds p398 2

如上所示:

  • 组 “0” 和 “1” 中的数据点一起出现在训练集中。

组 “2” 中的数据点一起出现在验证集/测试集中。

本站内容仅供学习交流,版权归原作者所有。