火车测试的一次失误的故事

发布的

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

在此之前,我们使用项目的标题和元数据特性。标题比缩略图更容易工作-机器学习的智慧。

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

设置场景

根据我们的经验,很难将多种类型的特性合并到一个统一的模型中。所以我们决定循序渐进,将缩略图添加到一个只使用一个功能的模型中——标题。

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

解决方案?我们应该分割数据集,使每个缩略图要么出现在train中,要么出现在test中,但不能同时出现在train中或test中。标题也是如此。

第一次尝试

听起来很简单。让我们从最简单的实现开始。我们将数据集中的所有行标记为“train”。然后,我们将迭代地将行转换为“测试”,直到我们得到想要的分割,假设是80%-20%。如何进行转换?在循环的每一步,我们将选择一个随机的“火车”行,并将其标记为转换。在转换之前,我们将检查所有具有相同标题/缩略图的行,并对它们进行标记。我们将继续这样做,直到没有更多的行可以标记。最后,我们将把标记的组转换为“test”。

然后事情就升级了

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

首先,我将向您展示问题的症状。为了能够将纯标题模型与同样使用缩略图的模型进行比较,我们也为纯标题模型使用了新的分割。这不会对它的性能造成影响,对吧?但我们得到了以下结果:

在最上面一行,我们可以看到我们已经知道的东西:只有标题的模型在列车集上具有更高的准确性,而且准确性不受分割比例的显著影响。

问题出现在最下面一行,我们在这里应用了新的分割方法。我们希望看到类似的结果,但在测试中只使用游戏模式的效果更好。什么?…不应该是这样的。此外,该比率对性能影响很大。是怀疑……

那么问题隐藏在哪里呢?

你可以把我们的数据集想象成一个二部图,一边是缩略图,另一边是标题。如果有具有缩略图和标题的项,则缩略图和标题之间存在边。

我们在新的分离中有效地做的是,确保每个连接的组件完整地驻留在训练集或测试集中。

事实证明,这种分裂是有偏见的。它倾向于为测试集选择大的组件。假设测试集应该包含15%的行。你会期望它包含15%的成分,但我们得到的是4%。

第二次尝试

我们所做的有什么问题吗?当您对一行进行随机抽样时,从特定组件获得一行的概率与组件的大小成正比。因此,测试集最终只包含少量的大组件。这可能是违反直觉的,但这里有一个代码片段,你可以尝试自己体验:

将numpy作为np导入。pyplot plt def train_test_split (component_sizes test_size):列车= component_sizes测试=[]而总和(测试)< test_size:转换= np.random.choice(范围(len(火车)),p = train.astype(浮动)/(火车)和test.append(火车[将])火车= np.delete(火车、转换)返回的火车,测试component_sizes = np。Array (range(1, 10000)) test_size = int(sum(component_sizes) * 0.5)训练,测试= train_test_split(component_sizes, test_size) plt。Hist ([train, test], label=['train', 'test'], bins=30) plt。标题('分布的大小的组件',fontsize=20) plt。Xlabel ('component size', fontsize=16)

列车与测试集构件尺寸分布不同。

现在我们更好地形式化了我们用二部图所做的,我们可以通过随机抽样连通分量来实现分割,而不是随机抽样行。这样,每个组件都有相同的被测试集选中的概率。

关键

将数据集划分为训练测试的方式对于项目的研究阶段至关重要。在进行研究时,您将花费大量时间查看测试集的性能。构造测试集以代表推理时发生的事情并不总是简单的。

以向用户推荐商品的任务为例:你既可以推荐一个全新的商品,也可以推荐一个过去已经向其他用户展示过的商品。两者都是重要的。

为了理解模型在研究阶段是如何离线运行的,您必须构建一个测试集,其中包含全新的项目和出现在列集中的项目。正确的比例是多少?很难说,我想这可以作为另一篇文章的主题

今天就开始你的Taboola事业吧!