机器学习中七种常见的数据泄露原因
原文:towardsdatascience.com/seven-common-causes-of-data-leakage-in-machine-learning-75f8a6243ea5当我在评估 ChatGPT、Claude 和 Gemini 等 AI 工具用于机器学习用例时,如我在中所述,我遇到了一个关键陷阱:机器学习中的数据泄露。这些 AI 模型在将数据集分成训练集和测试集之前,使用了整个
原文:
towardsdatascience.com/seven-common-causes-of-data-leakage-in-machine-learning-75f8a6243ea5
当我在评估 ChatGPT、Claude 和 Gemini 等 AI 工具用于机器学习用例时,如我在上一篇文章中所述,我遇到了一个关键陷阱:机器学习中的数据泄露。这些 AI 模型在将数据集分成训练集和测试集之前,使用了整个数据集来创建新的特征——这是数据泄露的常见原因。然而,这不仅仅是一个 AI 错误;人类也常常犯这样的错误。
机器学习中的数据泄露发生在训练数据集之外的信息渗透到模型构建过程中。这导致性能指标膨胀,模型无法泛化到未见过的数据。在这篇文章中,我将介绍七种常见的数据泄露原因,以便你不会像 AI 一样犯同样的错误。
图像由 DALL·E 提供
问题设置
为了更好地解释数据泄露,让我们考虑一个假设的机器学习用例:
想象一下,你是一家像美国运通这样的主要信用卡公司的数据科学家。每天,数百万笔交易被处理,不可避免地,其中一些是欺诈性的。你的任务是构建一个能够实时检测欺诈的模型。你拥有包含已知欺诈案例的历史数据,这使得这是一个典型的分类问题,数据不平衡,因为欺诈交易通常只占总额的一小部分。
以下是一些您手头可用的功能:
-
与交易相关的特征:交易金额、货币、时间、账单地址、类型(在线与实体)、位置等。
-
与卡片相关的特征:信用额度、卡片余额、卡片类型、卡片期限等。
-
与商家相关的特征:商家名称、商家类别、商家地址等。
-
与客户相关的特征:客户地址、年龄、收入、消费历史等。
数据预处理中的错误
为了准备您的数据集以进行模型开发,您通常会执行一些基本的数据转换步骤,例如缩放数值特征、编码分类变量和填充缺失数据。这些转换可能涉及从数据集的多个行中计算分布或指标。因此,如果在将数据集分成训练集和测试集之前对整个数据集应用它们,您就有可能将测试集中的信息泄露到训练过程中。
这可能发生的方式如下:
错误 1:使用完整数据集缩放数值特征
在我们的欺诈检测案例中,我们有许多数值特征,例如transaction amount和card tenure。某些机器学习模型,如具有 L1 或 L2 正则化的逻辑回归(岭回归或 Lasso 回归),需要将数值变量归一化,因为正则化会惩罚大的系数。通常,这涉及计算一个特征的均值和标准差(使用 scikit-learn 中的StandardScaler等)。如果你使用整个数据集来计算transaction amount的分布,然后将其应用到标准化训练和测试集上,你就是在将未见数据(测试数据)的交易信息暴露给训练。因此,我们应该只使用训练集的均值和标准差来在训练和测试集中标准化transaction amount。
错误 2:在完整数据集上执行目标编码
许多机器学习模型只接受数值变量。因此,我们需要将分类变量编码成数值变量。虽然独热编码很常见,但目标编码也是一种流行的方法。目标编码用来自标变量(例如这里的欺诈或非欺诈)的数值替换类别。这通常涉及计算每个类别的目标均值(例如,每个商家类别的欺诈率)。如果你从整个数据集中计算均值,你又会将测试集中包含的欺诈交易的重要信息泄露给训练集。因此,我们应该只使用训练数据来计算每个类别的目标均值,然后将学到的编码应用到测试集上。
错误 3:用测试集信息填补缺失值
在现实世界的数据集中,缺失数据很常见。例如,我们可能没有每个客户的income。一种常见的方法是用中位数值(即非空行的客户收入中位数)来填补缺失的数值。出于类似的原因,你应该只从训练集中计算中位数值,而不是整个数据集,并将其应用到两个集合上。
错误 4:在分割数据之前进行上采样/SMOTE
如上所述,欺诈检测通常是一个不平衡的分类问题,其中欺诈交易仅占总交易的一小部分。重采样,特别是上采样(复制少数类记录),是一种有用的技术,可以平衡数据集。如果你在上采样少数类(欺诈记录)后再将其划分为训练集和测试集,相同的欺诈案例可能会出现在两者中,导致人为的高性能。SMOTE(合成少数类过采样技术)是处理不平衡数据集的另一种常见方法。同样,如果它在训练-测试划分之前应用,从测试数据生成的合成示例可能会将信息泄露到训练集中。因此,这些不平衡数据集的处理应该只应用于训练集——一旦训练集通过上采样或 SMOTE 进行了增强,你应该在增强的训练集上训练你的模型,并在原始测试集上评估性能。
特征工程中的错误
现在你已经准备好了数据集,你就可以创建新的特征作为特征工程的一部分。然而,这也带来了数据泄露的风险。
错误 5:在特征工程中使用未来数据
在欺诈检测中,消费行为的突然变化通常是一个红旗。因此,你可能会创建像“交易金额与平均金额”这样的特征,衡量某笔交易与客户平均消费相比有多不寻常。但我们应该使用哪些数据点来计算这个平均值?为了避免数据泄露,我们需要确保不使用任何未来数据,因为当你对实时交易进行预测时,这些数据将不可用。在这种情况下,只有过去的交易应该用来计算平均消费。
数据划分中的错误
虽然将数据随机划分为训练集和测试集是常见的做法,但并不总是合适的。某些划分策略可能会无意中导致数据泄露,使得模型在训练过程中“看到”测试数据。
错误 6:训练集和测试集中的数据重叠
我们的欺诈检测数据集在交易级别,这意味着它将包含来自同一客户的多个交易记录。欺诈者在短时间内进行多次类似的欺诈交易尝试并不罕见。如果您随机将数据分割成训练集和测试集,来自同一客户的交易可能会同时出现在两个集中,使得模型可以从测试数据中“学习”。一个解决方案是使用分组洗牌分割而不是随机分割,它将在客户级别执行训练-测试分割,确保在分割过程中来自同一客户的交易保持在一起。这确保了您的模型是在真正未见过的数据上测试的,并且可以更好地泛化到新客户。
错误 7:未能为时间序列数据使用时间分割
当处理时间序列数据(例如,股票价格、天气模式、用户活动日志)时,在训练-测试分割中保持基于时间的序列至关重要。随机分割数据可能导致严重的数据泄露,因为模型将学习到在预测时间不可用的事件。
让我们假设一个新的机器学习用例,其中您想要预测一个客户的未来交易金额。随机分割数据集可能会导致未来交易影响训练集。相反,您应该使用时间分割,其中测试集中的所有数据点都发生在训练数据之后。这反映了现实世界场景,其中预测总是基于历史数据。
结论
当构建机器学习模型时,我们经常将数据预处理、特征工程和训练-测试分割作为独立的步骤来讨论。然而,它们是紧密相连的,一个步骤中的错误可能会影响整个建模过程。如上述示例所示,这些步骤的顺序需要仔细设计以避免数据泄露。在我们的例子中,您应该遵循以下顺序:
-
数据收集
-
训练-测试分割
-
数据预处理(仅基于训练数据)
-
特征工程(仅使用预测时可用信息)
-
模型训练和评估
更普遍地,为了防止数据泄露,始终问自己两个关键问题:
-
我是不是将测试集的信息暴露给了训练过程?
-
我是不是使用了在预测时不会可用未来的数据?
这两个问题将帮助您避免过度乐观的性能指标,并构建对新数据泛化良好的模型。您还应该将相同的原理应用于交叉验证过程,以确保每个折叠也免受泄露。
喜欢这篇文章吗?请在下方留言告诉我您的想法,或者您所知道的其它数据泄露的常见原因!
你可能还会喜欢我关于数据科学和 AI 的其他文章:
ChatGPT 与 Claude 与 Gemini 数据分析对比(第三部分):最佳机器学习 AI 助手
更多推荐



所有评论(0)