赛博空间7号

The greatest enemy of knowledge is not ignorance, it is the illusion of knowledge.--Stephen William Hawking

Data Leakage 详解

原文链接:kaggle


什么是Data Leakage?

数据泄漏是一个数据科学家必须理解的重要概念。如果你不知道如何防止数据泄漏发生,那么它将会频繁发生,而且它将会以最隐秘,最危险的方式摧毁你的模型。具体而言,数据泄漏会导值你的模型看起来很精确,但当你使用它是就会变得非常不精确。这篇教程会告诉你什么是数据泄漏以及如何避免数据泄露。

主要有两种类型的数据泄漏:Leaky PredictorsLeaky Validation Strategies.

Leaky Predictors

当你的特征中包含未来的特征时就会出现这种情况。

例如,你要预测谁会得肺病,我们来看一份原始数据:

Data Leakage 详解


人们会在患肺炎(get_pneumonia)之后服用抗生素(took_antibiotic_medicine)以治疗肺炎。所以在上表中我们能够看出患肺炎与服用抗生素的强关联关系。但是预测人是否患肺炎之前,服用抗生素这一栏应该都是False,当人被确诊有肺炎就会服用抗生素,这时候仅根据人是否服用抗生素就能判断该人是否患肺炎。所以服用抗生素这一特征不应该在预测之前被使用,否则就造成了标签泄漏。因为在实际预测中不可能有服用抗生素这一特征。

当我们使用数据泄露的特征预测模型时往往会有很高的准确度,此时模型学习的信息大都来自数据泄漏特征(比如上述的服用抗生素),而从其他特征中学习到很少的信息。所以在将模型应用到实际中时,由于实际数据并没有泄漏特征,而模型从其他特征中学习到的信息极少,所以在实际中模型的预测结果会非常糟糕。

为了防止这种类型的数据泄漏产生,任何在标签值之后更新或产生的特征都应该被排除掉。因为我们应用模型做新的预测时,这些特征都无法被模型利用。

Data Leakage 详解


Leaky Validation Stategies

这种数据泄漏是由不正确地使用交叉验证产生的。例如进行特征选择时,我们首先在所有样本的基础上选择“好”的特征子集,然后划分训练集和验证集,最后使用这些特征子集在训练集上训练出分类模型应用于验证集上。这些“好”的特征子集已经“看到了”验证集的信息造成了数据泄漏。造成的后果是验证分数很高,但在测试集测试是测试分数很低。验证集是为了验证模型在它没见过的数据上的效果好坏。所以正确做法是先进行训练集验证集划分,在训练集上特征选择,然后应用到验证集上。(参考The Element of Statistical Learning(2nd)7.10.2)

Preventing Leaky Predictors

没有一种解决方案可以普遍地防止泄漏的预测特征。它需要您对数据的了解,对特定案例的熟悉和常识。

然而泄漏特征往往与标签有很高的统计关联性,所以要记住两种策略:

  • 筛选可能的泄漏预测特征,查找与标签统计相关的列

  • 假如你建立的模型发现它极度精确,那么就有数据泄漏的可能。

Preventing Leaky Validation Strategies

当对数据预处理时,要现在训练集上预处理,然后应用到验证集上。这很容易通过scikit-learn Pipeline做到。当进行交叉验证时,使用Pipeline并在Pipeline中进行预处理非常重要。










发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

© 版权所有:沈阳市和平区赛博空间咨询部|辽ICP备18005891号
Powered by Z-BlogPHP & Yiwuku.com