# 机器学习中的数据泄漏

> 原文： [https://machinelearningmastery.com/data-leakage-machine-learning/](https://machinelearningmastery.com/data-leakage-machine-learning/)

在开发预测模型时，数据泄漏是机器学习中的一个大问题。

数据泄漏是指来自训练数据集外部的信息用于创建模型的时间。

在这篇文章中，您将发现预测性建模中的数据泄漏问题。

阅读这篇文章后你会知道：

*   什么是数据泄漏是预测性建模。
*   数据泄漏的迹象以及为什么会出现问题。
*   您可以使用的提示和技巧，以最大限度地减少预测性建模问题的数据泄漏。

让我们开始吧。

![Data Leakage in Machine Learning](img/25023ca02595bba7bd16d28f131d8b25.jpg)

机器学习中的数据泄漏
[DaveBleasdale](https://www.flickr.com/photos/sidelong/20147524535/) 的照片，保留一些权利。

## 预测性建模的目标

预测性建模的目标是开发一种模型，在训练期间看不到新数据的准确预测。

这是一个难题。

这很难，因为我们无法在我们没有的东西上评估模型。

因此，我们必须通过仅对我们拥有的一些数据进行训练并在其余数据上进行评估来估计模型在看不见的数据上的表现。

这是交叉验证和更复杂技术的基础，这些技术试图减少此估计的方差。

## 什么是机器学习中的数据泄漏？

如果不是完全无效的预测模型，数据泄漏可能会导致您创建过于乐观。

数据泄漏是指来自训练数据集外部的信息用于创建模型的时间。该附加信息可以允许模型学习或知道否则将不知道的事物，并且反过来使得正在构建的模式的估计表现无效。

> 如果在您希望使用模型做出预测时实际上实际上不可用的任何其他特征是一个可能会导致模型泄漏的功能

- [数据怀疑](http://dataskeptic.com/epnotes/leakage.php)

> 当您用于训练机器学习算法的数据恰好具有您试图预测的信息时

- Daniel Gutierrez，[询问数据科学家：数据泄漏](http://insidebigdata.com/2014/11/26/ask-data-scientist-data-leakage/)

[计算机安全中有一个主题称为数据泄漏和数据丢失预防](https://en.wikipedia.org/wiki/Data_loss_prevention_software)，它与我们所讨论的相关但不相关。

### 数据泄漏是一个问题

这至少有三个原因是一个严重的问题：

1.  **如果您正在进行机器学习竞赛**，这是一个问题。顶级模型将使用泄漏数据而不是潜在问题的良好通用模型。
2.  **当您是提供数据的公司时，这是一个问题**。撤消匿名化和混淆可能会导致您没有预料到的隐私泄露。
3.  **当您开发自己的预测模型**时，这是一个问题。您可能正在创建过于乐观的模型，这些模型实际上是无用的，不能用于生产。

作为机器学习从业者，我们主要关注最后一个案例。

### 我有数据泄漏吗？

了解数据泄漏的一种简单方法是，如果您实现的表现似乎有点太好了。

就像你可以预测彩票号码或选择高精度的股票。

> “太好了不可能”表现是它存在的“死亡赠品”

- 第13章，[做数据科学：从前线直接谈话](http://www.amazon.com/dp/1449358659?tag=inspiredalgor-20)

数据泄漏通常是复杂数据集的一个问题，例如：

*   创建训练和测试集时的时间序列数据集可能很困难。
*   图形问题，其中随机采样方法可能难以构建。
*   模拟观察，如声音和图像，其中样本存储在具有大小和时间戳的单独文件中。

## 建立模型时最大限度地减少数据泄漏的技术

在开发预测模型时，您可以使用两种很好的技术来最小化数据泄漏，如下所示：

1.  在交叉验证折叠中执行数据准备。
2.  阻止验证数据集，以便对您开发的模型进行最终的健全性检查。

通常，优良作法是使用这两种技术。

### 1.在交叉验证折叠中执行数据准备

在准备机器学习数据时，您可以轻松泄露信息。

这种影响是过拟合您的训练数据，并且对您在不可见数据上的模型表现进行过于乐观的评估。

例如，如果您对整个数据集进行标准化或标准化，然后使用交叉验证来估计模型的表现，则表明您已经犯了数据泄漏的罪。

在计算缩放因子（如最小值和最大值或平均值和标准差）时，您执行的数据重新缩放过程了解了训练数据集中数据的完整分布。这些知识被标记在重缩放的值中，并被交叉验证测试工具中的所有算法利用。

在这种情况下，机器学习算法的非泄漏评估将计算用于在交叉验证的每个折叠内重新缩放数据的参数，并使用这些参数在每个循环上准备关于保持的测试折叠的数据。

> 现实情况是，作为一名数据科学家，您在准备，清理数据，估算缺失值，删除异常值等任何时候都存在产生数据泄漏情况的风险。您可能在准备数据时扭曲数据到了你将构建一个在你的“干净”数据集上运行良好的模型，但是在你真正想要应用它的真实情况中应用时会非常糟糕。

- 第313页，[做数据科学：从前线直接谈话](http://www.amazon.com/dp/1449358659?tag=inspiredalgor-20)

更一般地说，非泄漏数据准备必须在交叉验证周期的每个折叠内进行。

对于某些问题，您可以放宽此约束，例如，如果您可以自信地估计数据的分布，因为您具有其他领域知识。

但总的来说，最好在交叉验证折叠中重新准备或重新计算任何所需的数据准备工作，包括特征选择，异常值删除，编码，特征缩放和降维等投影方法等任务。

> 如果对所有数据执行特征选择然后交叉验证，则交叉验证过程的每个折叠中的测试数据也用于选择特征，这是表现分析的偏差。

- Dikran Marsupial，回答Cross Validated上的问题“[特征选择和交叉验证](http://stats.stackexchange.com/questions/27750/feature-selection-and-cross-validation)”。

像R中的R和scikit-learn这样的平台有助于自动化这种良好实践，使用中的[插入符包和scikit-learn](http://machinelearningmastery.com/caret-r-package-for-applied-predictive-modeling/) 中的[管道。](http://machinelearningmastery.com/automate-machine-learning-workflows-pipelines-python-scikit-learn/)

### 2.阻止验证数据集

另一种可能更简单的方法是将训练数据集拆分为训练集和验证集，并存储验证数据集。

完成建模过程并实际创建最终模型后，在验证数据集上对其进行评估。

这可以为您提供一个完整性检查，以确定您对绩效的评估是否过于乐观并且已经泄露。

> 基本上，真正解决这个问题的唯一方法是保留一个独立的测试集并保持它直到研究完成并用它进行最终验证。

- Dikran Marsupial回答问题“[我如何帮助确保测试数据不会泄漏到训练数据中？](http://stats.stackexchange.com/questions/20010/how-can-i-help-ensure-testing-data-does-not-leak-into-training-data) “在Cross验证

## 5个防止数据泄漏的技巧

*   **时间截止**。在感兴趣事件发生之前删除所有数据，重点关注您了解事实或观察的时间，而不是观察发生的时间。
*   **添加噪音**。将随机噪声添加到输入数据以尝试平滑可能泄漏变量的影响。
*   **删除Leaky变量**。使用帐号和ID等变量评估简单的基于规则的模型行OneR，以查看这些变量是否泄漏，如果是，则删除它们。如果您怀疑变量是否泄漏，请考虑将其删除。
*   **使用管道**。大量使用管道架构，允许在交叉验证折叠中执行一系列数据准备步骤，例如R中的插入符包和scikit-learn中的管道。
*   **使用保持数据集**。在使用模型之前，请暂停一个看不见的验证数据集作为模型的最终完整性检查。

## 进一步阅读数据泄漏

关于数据泄漏的材料并不多，但那些确实存在的珍贵论文和博客文章都是黄金。

以下是一些更好的资源，您可以用它们来了解应用机器学习中数据泄漏的更多信息。

*   [数据挖掘中的泄漏：秘籍，检测和避免](https://www.cs.umb.edu/~ding/history/470_670_fall_2011/papers/cs670_Tran_PreferredPaper_LeakingInDataMining.pdf) [pdf]，2011。（推荐！）
*   [关于数据怀疑播客](http://dataskeptic.com/epnotes/leakage.php)数据泄漏的迷你剧集。
*   第13章：从数据竞争中吸取的教训：数据泄漏和模型评估，来自[做数据科学：直接从前线谈话](http://www.amazon.com/dp/1449358659?tag=inspiredalgor-20)，2013。
*   [询问数据科学家：数据泄漏](http://insidebigdata.com/2014/11/26/ask-data-scientist-data-leakage/)，2014年
*   [Kaggle Wiki上的数据泄漏](https://www.kaggle.com/wiki/Leakage)
*   [有关ICML 2013鲸鱼挑战赛](https://www.kaggle.com/c/the-icml-2013-whale-challenge-right-whale-redux/forums/t/4865/the-leakage-and-how-it-was-fixed/25839#post25839)数据泄漏的精彩讨论

## 摘要

在这篇文章中，您在开发预测模型时发现了机器学习中的数据泄漏。

你了解到：

*   开发预测模型时会出现什么数据泄漏。
*   为什么数据泄漏是一个问题以及如何检测它。
*   在开发预测模型时，您可以使用的技术来避免数据泄漏。

您对数据泄漏或此帖有任何疑问吗？在评论中提出您的问题，我会尽力回答。