外观
随机划分何时对机器学习模型是致命的?
When is Random Splitting Fatal for ML Models?
在几乎所有的机器学习(ML)入门课程中,我们都会听到这样一条建议:把给定的数据随机划分(random splitting)成训练集和验证集。

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

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

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

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

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

假设我们有如下数据集:

- x1 和 x2 是特征(feature)。
- y 是目标变量。
- group 表示分组依据。
首先,我们从 sklearn 导入 GroupShuffleSplit 并实例化该对象:

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

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

如上所示:
- 组 “0” 和 “1” 中的数据点一起出现在训练集中。
组 “2” 中的数据点一起出现在验证集/测试集中。