Andrew Ng 的团队曾在一篇研究论文中犯了一个大错误。 这个错误是由于随机拆分数据造成的。 以下是具体发生了什么(以及解决方案):
通常使用随机拆分生成训练集和验证集。 然而,在许多情况下,这对模型构建可能是致命的。 考虑构建一个为图像生成标题的模型。 由于语言的固有特性,每张图像可以有许多不同的标题。 - 图像-1 → 标题-1,标题-2,标题-3,等等。 - 图像-2 → 标题-1,标题-2,标题-3,等等。 查看这个 👇
如果我们使用随机拆分,相同的数据点(图像)将同时出现在训练集和验证集中。 因此,我们最终在模型训练过的实例上评估模型。 这是数据泄漏(也称为组泄漏)的一个例子,导致过拟合!
在 Andrew Ng 的论文中也发生了同样的事情,他们准备了一个医学数据集来检测肺炎。 - 总图像 = 112k - 总患者 = 30k 由于随机拆分,同一患者的图像在训练集和验证集中都有。 这导致了数据泄漏,验证分数看起来比实际要好得多。 这是他们的初始论文👇
组别洗牌分割解决了这个问题。 有两个步骤: 1) 将所有与一张图像对应的训练实例分组。 2) 分组后,整个组(一个图像的所有示例)必须随机分配到训练集或验证集中。 这将防止组泄漏。
如果你使用 Sklearn,GroupShuffleSplit 实现了这个想法。 作为一个例子,考虑我们有以下数据集: - x1 和 x2 是特征。 - y 是目标变量。 - group 表示分组标准。 查看这个 👇
首先,我们从sklearn导入GroupShuffleSplit并实例化该对象。 接下来,该对象的split()方法让我们执行分组拆分。它返回一个生成器,我们可以解包它以获得以下输出: - “A”和“C”组中的数据点一起出现在训练集中。 - “B”组中的数据点一起出现在验证/测试集中。 查看这个👇
几天后,Andrew Ng 的团队在使用相同的组随机分割策略后更新了论文,以确保相同的患者不会同时出现在训练集和验证集中。 👉 轮到你了:你之前遇到过这个问题吗?
11.83K