我正在参加一个数据科学比赛,其测试集的分布与训练集的分布不同。我想从与测试集非常相似的训练集中对观察结果进行子采样。
我怎样才能做到这一点?
我正在参加一个数据科学比赛,其测试集的分布与训练集的分布不同。我想从与测试集非常相似的训练集中对观察结果进行子采样。
我怎样才能做到这一点?
Answers:
很好的问题,这就是机器学习范式中所谓的“协变量偏移”,“模型漂移”或“非平稳性”等。
建立机器学习模型以进行未来预测的一个关键假设是,看不见的数据(测试)来自与训练数据相同的分布!但是,实际上,这种相当简单的假设很容易打破,由于许多原因,即将到来的数据(其分布)会随时间变化。对于那些可能不熟悉这个非常重要的问题的人,我建议您在此处或发布信息!
对我来说,您的问题属于同一类。尽管我没有完美的解决方案(提供的实现),但我认为您可能会看到:
快速更新(一个很好的解决方案):我找到了该研究论文的KLIEP算法的Python实现(最后一点),以找到这些权重。它似乎易于使用!基本上,它通过放置权重(通过KLIEP算法)对训练进行重新采样,从而使训练和测试的分布相似的假设尽可能成立。
我想从与测试集非常相似的训练集中对观察结果进行子采样。
我不确定您是否愿意这样做。整个目的是训练您的算法,以便将其很好地推广到看不见的数据。
通常,一个人应该使其测试数据适应其火车数据(例如,根据火车数据标准化测试数据),而不是相反。实际上,您不知道测试数据。
训练组子采样可能不是最佳解决方案!
在有监督的学习任务中,测试/执行集与训练集的分布/功能之间的差异非常普遍(这是诸如Kaggle之类的比赛具有挑战性的原因之一)。这就是为什么我们说过去的表现(仅)可以用作估算未来表现的指南,但并不能表示或保证它。因此,与可能在列车(子)集上表现很好但在看不见的数据上表现不佳的微调模型相比,泛化模型始终是首选。
虽然这种差异是正常的,但过去和将来的样本之间的差距过大可能被称为概念漂移的示例,而概念漂移本身就是一个活跃的研究领域。鉴于您的问题,我无法判断您的案件是正常的ML案件,还是概念漂移确实在发生。
这些是我的建议:
训练具有高泛化能力的许多模型。使用火车数据集中的引导抽样,您可以轻松计算误差的偏差和方差分量。回想一下,您正在寻找的是低方差模型(数据变化会对数据性能产生边际影响),而不是低偏差但高方差模型(可能过度适合您的训练(子)集)。现在,您可以选择最佳算法,并根据测试集对其进行评估。注意,在训练期间,我们应该不看测试集!
与其进行几次随机下采样,不如寻找标准化/归一化以及功能选择/工程。这些技术对于学习更通用的模型可能是实用的。例如,有时特征域的范围可能随时间而变化,而分布的形状(无论是什么形状)几乎保持不变(例如,向左或向右移动的相同分布)。在这种情况下,简单的标准化(即使用不同的映射功能将训练样本和测试样本映射到预定义的空间,例如[0,1])可以减轻症状。
仅当您基于有关问题的一些知识(不仅仅是为了在测试数据集上获得更好的准确性)进行系统下采样时,才可以使用系统下采样。例如,您可能知道火车数据中的某些记录是很久以前从远场采样的,或者受特定因素的影响,这些因素将来都不会发生(在测试数据收集中)。在这种情况下,你可能会删除这些样本,可以是因为你有信心,你会不会在将来看到这样的模式不相关的(我的意思是,你应该有一个合理的训练子集的选择背后,而不是寻找到测试组实际上,您没有访问权限)。在这种情况下,我称之为离群值去除 而不是下采样。
python中有一个很好的软件包(scikit学习)
http://scikit-learn.org/stable/modules/generation/sklearn.model_selection.train_test_split.html
您可以使用此软件包从训练集中对观察结果进行抽样。