糟糕的训练-测试拆分的故事

将数据集拆分为训练测试集有时可能比人们想象的要复杂。

来源:Another Datum

大约一年前,我们在用于向用户推荐内容项的模型之一中加入了新类型的功能。我说的是内容项的缩略图:

在此之前,我们使用了项目的标题和元数据功能。与缩略图相比,标题更容易使用——从机器学习的角度来看。

我们的模型已经成熟,是时候将缩略图添加到聚会中了。这个决定是引入我们训练测试分割程序的可怕偏见的第一步。让我来揭开这个故事……

设置场景

根据我们的经验,很难将多种类型的功能合并到统一的模型中。所以我们决定采取循序渐进的方法,将缩略图添加到仅使用一个功能(标题)的模型中。

使用这两个功能时,您需要考虑一件事,那就是数据泄漏。当只处理标题时,您可以天真地将数据集随机拆分为训练和测试 - 删除具有相同标题的项目。但是,当您同时处理标题和缩略图时,您无法应用随机拆分。这是因为许多项目共享相同的缩略图或标题。库存照片是跨不同项目共享缩略图的一个很好的例子。因此,记住在训练集中遇到的标题/缩略图的模型可能在测试集上有良好的表现,但在泛化方面表现不佳。

解决方案?我们应该拆分数据集,以便每个缩略图都出现在训练或测试中,但不能同时出现在两者中。标题也是如此。

第一次尝试

然后事情升级

乍一看,这个简单的解决方案似乎没有什么问题。每个缩略图/标题都出现在训练或测试中。那么问题似乎是什么?

在第一行中,我们看到了我们已经知道的内容:仅标题模型在训练集上的准确率更高,并且准确率不受分割比例的显著影响。

那么问题出在哪里?

第二次尝试

import numpy as np import matplotlib.pyplot as plt def train_test_split ( component_sizes , ): =