原文:
towardsdatascience.com/common-causes-of-data-leakage-and-how-to-spot-them-17113406f9f8
图片来源:realaxer @Unsplash.com
数据科学家最可怕的噩梦之一就是数据泄露。那么数据泄露为什么如此有害呢?因为你的模型可能受到的影响方式被设计成让你相信你的模型非常出色,你应该期待未来有出色的结果。
如你所知,每个机器学习模型的主要目标是将其学习的模式推广到未来的数据。由于我们无法真正访问未来的数据(除非先制造一台时光机),在模型开发期间模拟这一点的最佳方式是留出一部分测试集和验证集来评估模型性能。
在开发过程中,数据科学家旨在提高模型的测试和验证性能。如果结果令人满意,那么数据科学家就会认为他们的模型已经准备好投入生产。这就是数据泄露如此危险的原因。因为它能够隐藏在看似无辜的行为中,它在后台潜伏,等待你将模型投入生产,然后才发现实际生活中的性能远远不如测试集上的性能。
通常,数据泄露涉及将污染我们的训练集,这些污染最终会违反“未来数据集”规则的一个或多个参数。这是模型部署失败的最主要原因之一。
在本文中,我们将讨论一些最常见的数据泄露来源以及一些识别它们的技巧!
让我们深入探讨!
特征泄露
可能是最著名的数据泄露来源(同时也是最容易发现的)。
当我们拥有与目标直接相关的特征,而这些特征通常是目标事件的结果时,就会发生特征泄露。通常,特征泄露发生是因为特征值在目标事件之后某个时间点被更新。
让我们看看一些例子:
-
- 你正在尝试预测某位客户的贷款违约情况,而你其中一个特征是客户在过去 30 天内发出的外呼电话次数。但你不知道的是,在这个虚构的银行中,只有当客户已经进入违约状态时,才会收到外呼电话。
-
- 你正在尝试预测一位患者的某种疾病,并使用患者进行特定诊断测试的次数作为预测特征。然而,你后来发现这种测试只针对有很高患病可能性的人。
-
- 你正在使用名为 days_finish_contract*的特征来预测客户是否会流失。
*客户与特定公司签订的最后一份合同结束后(例如,在电信业务中)。如果客户不续约,这确实是一个流失事件。
这三个例子也展示了不同级别的特征泄露。例如,在 1)和 3)中,目标和特征之间存在直接相关性,并且几乎可以肯定 100%的目标变量将具有这些非空值变量。然而,2)更难发现,因为其他患者可能已经接受了诊断测试并且没有患病,这使得这个泄露来源不那么明显。
识别特征泄露的一种方法是通过在不同模型中获得的 特征重要性 数据。**对我来说,效果非常好的一种方法是拟合一个非常浅的决策树,并检查是否有某个特征与其他特征相比在重要性上有巨大的差异。**当我发现某个特征被过度索引时,这些特征通常与泄露问题有关。
为了解决这些问题,建议你研究这些具有泄露的特征是如何生成的,这样你就可以:
-
如果没有其他方法生成它,就删除该特征。
-
改变特征,以确保没有来自未来的信息泄露到目标中。
使用随机测试分割的时间相关数据
有趣的故事——我就是这样学到的。过去,我开发机器学习模型来预测足球比赛的结果,结果却得到了一个完全有缺陷的投注系统。
可能你以前有过类似的感受——你有没有训练过时间序列模型,并在测试集上取得了惊人的结果?
当你在具有时间依赖性的数据集上执行 随机训练-测试 划分时,这种情况相当常见。即使你不是在训练时间序列模型,但你的行是时间依赖的,你也应该始终基于时间执行连续的训练-测试划分,而不是随机训练-测试划分。
时间依赖性数据建模是一个棘手的问题,尤其是因为协变量和数据分布会随着时间的推移而变化。如果你向训练集暗示了新分布的任何部分,你的模型将会是有缺陷的。
对于时间依赖性数据,建议在连续交叉验证(CV)机制上进行评估,类似于以下内容:
适用于时间依赖数据的适当训练和测试 – 作者图片
所以,是的……绝对不要在时间依赖性数据上使用随机训练-测试分割!
通过缩放和预处理向测试集暗示信息
这甚至有时连一些经验丰富的数据科学家也会陷入的更复杂的情况。在进行异常值分析、缩放、缺失值插补时,始终确保你在训练集上以及训练-测试划分之后进行这些分析。
有时候人们会将这句话与应用相同的转换到测试集混淆——虽然这一点完全正确(你的测试集需要模仿训练集的规模且不包含缺失值),但你不应向训练集透露任何关于测试集分布的线索。
例如,想象你正在应用一个标准缩放器(使用均值和标准差的 Z 分数)。你希望这个标准缩放器记住训练集的平均值和标准差。在那之后,你将使用来自训练集的固定统计数据应用相同的缩放器到测试集上。
考虑另一个著名的预处理步骤:移除异常值。从测试集中移除异常值有意义吗?好吧,如果你知道未来将会是异常值(记住测试集只是模型将要使用的未来数据集的非常糟糕的模拟),那么请告诉我,因为你刚刚发明了一台时光机!
由于未来(当然,你可以从模型评分中移除明显的异常值)无法移除异常值,你通常缺乏关于“未来”异常值将呈现何种样子的信息。如果你在测试集中移除异常值,你应该预期测试集性能和实际部署之间存在更大的漂移。
为了避免这种类型的泄露,在你在数据上做任何事情之前,先进行训练集-测试集的划分。
数据科学家在生产中发现他们的模型是错误的——由微软设计生成的 AI 图像
数据生成和来源的泄露
这一点更难发现。数据生成和/或数据来源的特征泄露通常与数据收集方式相关。作为数据科学家,你可能无法完全控制这一点。
让我们以我们指出的客户违约为例:想象你正在构建一个预测模型,想要找出客户是否会在下一期违约,而你发现客户对外拨打电话的数量是预测这一点的绝佳特征。
你与正在积极进行这些电话的人交谈,并发现这个过程是公平的。他们实际上会联系风险较高的客户,这可能意味着你将这个特征包含在模型中是有意义的。但是,在与他们坐下来之后,你会发现有一些电话是在他们确定客户将违约之后发生的。
发生的情况是,你的 IT 系统只在实际发生违约后的第二天记录违约情况,因此一些这些电话实际上是询问客户为什么违约。如果你使用这个特征(电话是在第 x 天进行的,违约是在第 x+1 天记录的),你实际上会通过将特征的信息泄露到目标中,为模型预测添加泄露。
这是最难发现的数据泄露,因为它要求你深入了解你的特征是如何生成的,以及良好的数据治理模型。尽管如此,使用我们在特征泄露部分讨论的技术可以是一个快速且直接的方法来理解你是否在你的数据生成和来源中存在明显的泄露。
特征工程
另一种常见的生成数据泄露的方式是在特征工程过程中。尽管这仅仅是特征泄露的一部分,但它如此普遍,以至于我需要指出这一点。
一个常见的例子是在创建时间序列的移动平均时。通常,人们可能会混淆时间间隔,并添加你本应预测的平均值的时间段。如果被忽视,这将在时间序列模型上造成巨大的扭曲。
另一个例子是当使用由其他机器学习模型生成的特征时。使用这些特征总是有风险的,因为这些模型内部存在不确定性(并且可能存在泄露)。基于其他模型构建这些特征可能会产生重大影响,"看似"创建一个更好的模型,但失去了其泛化能力。
结论
就这些了!这些是我作为数据科学家职业生涯中发现的最常见的数据泄露问题。
简而言之,数据泄露是机器学习模型的隐形杀手。它旨在让你感觉你有一个很棒的模型,但其性能高度受泄露问题的影响。数据泄露问题可能非常严重,以至于它们可以在你将其投入生产时立即影响你的模型。尽快识别泄露不仅会使你的模型更加稳定,而且在实际世界中更加准确。
您知道我这里没有提到的其他数据泄露原因吗?在评论中指出它们!
此外,也欢迎您在我的 YouTube 频道上关注我:

被折叠的 条评论
为什么被折叠?



