13.Data Leakage

本教程是ML系列的一部分。在此步骤中,你将学习什么是data leakage及如何预防它。 

What is Data Leakage

数据泄漏是数据科学家需要理解的最重要问题之一。 如果您不知道如何防止它,则会频繁出现泄漏,并且会以最微妙和危险的方式破坏您的模型。 具体而言,泄漏会导致模型看起来准确,当您开始使用模型做出决策,模型则变得非常不准确。 本教程将向您展示泄漏是什么以及如何避免泄漏。

泄漏有两种主要类型:Leaky Predictors and a Leaky Validation Strategies

Leaky Predictors

当您的预测因素包含无法使用的数据时,就会发生这种情况。
例如,假设您想预测谁会患上肺炎。 原始数据的前几行可能如下所示:

got_pneumoniaageweightmaletook_antibiotic_medicine...
False65100FalseFalse...
False72130TrueFalse...
True58100FalseTrue...

人们在患肺炎后服用抗生素药物才能康复。 因此原始数据显示了这些列之间的紧密关系。 但是,确定了got_pneumonia的值后,take_antibiotic_medicine经常被改变。 这是目标泄漏。

该模型将发现,对于take_antibiotic_medicine而言,任何具有False值的人都没有肺炎。 验证数据来自同一来源,因此模式将在验证中重复,模型将具有很好的验证(或交叉验证)分数。 但随后在现实世界中部署时,该模型将非常不准确。

为防止此类数据泄漏,应排除在目标值实现后更新(或创建)的任何变量。 因为当我们使用此模型进行新的预测时,该数据将无法使用。

Leaky Data Graphic

Leaky Validation Strategy

当您不小心区分训练数据和验证数据时,会发生不同类型的泄漏。 例如,如果在调用train_test_split之前运行预处理(比如为缺失值拟合Imputer),就会发生这种情况。 验证旨在衡量模型对之前未考虑过的数据的影响。 如果验证数据影响预处理行为,您可以以微妙的方式破坏此过程。最终结果? 您的模型将获得非常好的验证分数,让您对它充满信心,但在部署它以做出决策时表现不佳。

Preventing Leaky Predictors

没有一种解决方案可以普遍地防止泄漏的预测因素。 它需要有关您的数据,特定案例检查和常识的知识。

然而,泄漏预测因素通常与目标具有高度统计相关性。 所以要记住两个策略:

  •      要筛选可能的泄漏预测因素,请查找与目标统计相关的列。
  •      如果您构建模型并发现它非常准确,则可能存在泄漏问题。

Preventing Leaky Validation Strategies

如果您的验证基于简单的train-test-split,则从任何类型的拟合中排除验证数据,包括预处理步骤的拟合。 如果您使用scikit-learn Pipelines,这会更容易。 使用交叉验证时,使用管道并在管道内进行预处理更为重要。

Example

我们将使用一个关于信用卡应用程序的小数据集,我们将构建一个模型来预测哪些应用程序被接受(存储在一个名为card的变量中)。 以下是数据:

[1]

import pandas as pddata = pd.read_csv('../input/AER_credit_card_data.csv', true_values = ['yes'],false_values = ['no'])
print(data.head())
card  reports       age  income     share  expenditure  owner  selfemp  \
0  True        0  37.66667  4.5200  0.033270   124.983300   True    False   
1  True        0  33.25000  2.4200  0.005217     9.854167  False    False   
2  True        0  33.66667  4.5000  0.004156    15.000000   True    False   
3  True        0  30.50000  2.5400  0.065214   137.869200  False    False   
4  True        0  32.16667  9.7867  0.067051   546.503300   True    False   dependents  months  majorcards  active  
0           3      54           1      12  
1           3      34           1      13  
2           4      58           1       5  
3           0      25           1       7  
4           2      64           1       5  

我们使用data.shape看到这是一个小数据集(1312行),所以我们应该使用交叉验证来确保模型质量的准确精度。

[2]

data.shape(1319, 12)

[3]

from sklearn.pipeline import make_pipeline
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_scorey = data.card
X = data.drop(['card'], axis=1)# Since there was no preprocessing, we didn't need a pipeline here. Used anyway as best practice
modeling_pipeline = make_pipeline(RandomForestClassifier())
cv_scores = cross_val_score(modeling_pipeline, X, y, scoring='accuracy')
print("Cross-val accuracy: %f" %cv_scores.mean())Cross-val accuracy: 0.979528

根据经验,您会发现找到98%的精确模型是非常罕见的。它发生了,但我们应该更仔细地检查数据以确定它是否是目标泄漏。

以下是数据摘要,您也可以在数据选项卡下找到它:

  • card: Dummy variable, 1 if application for credit card accepted, 0 if not
  • reports: Number of major derogatory reports
  • age: Age n years plus twelfths of a year
  • income: Yearly income (divided by 10,000)
  • share: Ratio of monthly credit card expenditure to yearly income
  • expenditure: Average monthly credit card expenditure
  • owner: 1 if owns their home, 0 if rent
  • selfempl: 1 if self employed, 0 if not.
  • dependents: 1 + number of dependents
  • months: Months living at current address
  • majorcards: Number of major credit cards held
  • active: Number of active credit accounts


一些变量看起来很可疑。例如,expenditure是指支付此卡还是在使用之前卡上的支出?

此时,基本数据比较可能非常有用:

[4]

expenditures_cardholders = data.expenditure[data.card]
expenditures_noncardholders = data.expenditure[~data.card]print('Fraction of those who received a card with no expenditures: %.2f' \%(( expenditures_cardholders == 0).mean()))
print('Fraction of those who received a card with no expenditures: %.2f' \%((expenditures_noncardholders == 0).mean()))
Fraction of those who received a card with no expenditures: 0.02
Fraction of those who received a card with no expenditures: 1.00

每个人(card == False)都没有支出,而card== True的人中只有2%没有支出。 我们的模型似乎具有高精度并不奇怪。 但这似乎是数据泄露,其中支出可能意味着*他们申请的卡上的支出。**。

由于share部分由支出决定,因此也应予以排除。 变量active,majorcards有点不太清楚,但从描述中看,它们听起来很有意义。 在大多数情况下,如果您无法追踪创建数据的人员以了解更多信息,那么最好是安全而不是抱歉。

我们将运行一个没有泄漏的模型如下:

[5]

potential_leaks = ['expenditure', 'share', 'active', 'majorcards']
X2 = X.drop(potential_leaks, axis=1)
cv_scores = cross_val_score(modeling_pipeline, X2, y, scoring='accuracy')
print("Cross-val accuracy: %f" %cv_scores.mean())Cross-val accuracy: 0.806677

这种准确性相当低,这一方面令人失望。 但是,我们可以预期在新应用程序中使用它的时间大约为80%,而泄漏模型可能会比这更糟糕(即使它在交叉验证中的表观得分更高)。

Conlusion

在许多数据科学应用中,数据泄漏可能是数百万美元的错误。 仔细分离训练和验证数据是第一步,管道可以帮助实现这种分离。 泄漏预测因素是一个更常见的问题,泄漏的预测因子更难以追踪。 谨慎,常识和数据探索的组合可以帮助识别泄漏的预测变量,以便从模型中删除它们。

Exercise


查看正在进行的项目中的数据。 有没有可能导致泄漏的预测因子? 作为提示,来自Kaggle比赛的大多数数据集都没有这些变量。 一旦你通过那些精心策划的数据集,这就成了一个常见的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/440297.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Apollo自动驾驶入门课程第②讲 — 高精地图

目录 1. 高精地图与传统地图 2. 高精地图与定位、感知规划的关系 2.1 高精地图用于定位 2.2 高精地图用于感知 2.3 高精地图用于规划 3. Apollo高精度地图与构建 3.1 Apollo高精地图 3.2 Apollo高精地图的构建 本文转自微信公众号: Apollo开发者社区 原创&a…

项目总结2:ionic3开发跨平台App如何设置和替换应用图标及启动图

前言: 和原生开发一样,ionic官方提供的设置方式也很简单,只不过多了一个步骤:基于ionic命令的方式自动修改全局的配置文件config.xml。 设置或替换应用图标和应用启动图: 把UI提供的图标拿过来改成特定的名称"i…

LeetCode刷题实战(13):Roman to Integer

题目描述: 13 Roman to Integer 49.5%Easy Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M. Symbol Value I 1 V 5 X 10 L 50 C 100 D …

1.Intro to Deep Learning and Computer Vision

Intro 这是Kaggle深度学习教育课程的第一课。 在本课程结束后,您将了解卷积。 卷积是计算机视觉(以及许多其他应用程序)中深度学习模型的基本构建块。 之后,我们将很快开始使用世界一流的深度学习模型。 Lesson [1] from IPy…

SpringMVC常用的视图接口分类及实现类

SpringMVC中常用的视图接口分类及对应的实现类: URL资源视图:InternalResourceView、JstlView 文档视图:AbstractExcelView、AbstractPdfView 报表视图:ConfigurableJsperReportsView等JasperReports报表技术的视图 JSON视图&…

Apollo自动驾驶入门课程第③讲 — 定位

目录 1. 定位的概述 2. 定位方法介绍 2.1 GNSS RTK 2.2 惯性导航 2.3 激光雷达定位 2.4 视觉定位 2.5 Apollo定位 本文转自微信公众号:Apollo开发者社区 原创: 阿波君 Apollo开发者社区 8月17日 上周我们发布了 Apollo入门课堂第②讲—高精地图&…

Linux与Bash 编程——Linux文件处理命令-L1

目录: linux系统与shell环境准备 Linux系统简介操作系统简史Linux的发行版:Linux与Windows比较:Linux安装安装包下载Linux的访问方式远程登录方式远程登录软件:mobaxterm的使用:使用电脑命令行连接:sshd的…

网络编程懒人入门(一):快速理解网络通信协议(上篇)

转自即时通讯网:http://www.52im.net/ 原作者:阮一峰(ruanyifeng.com),本文由即时通讯网重新整理发布,感谢原作者的无私分享。 1、写在前面 论坛和群里常会有技术同行打算自已开发IM或者消息推送系统,很…

PCA算法中样本方差和协方差的无偏估计与n-1的由来

原文出处: http://blog.sina.com.cn/s/blog_c96053d60101n24f.html 在PCA算法中的方差协方差计算公式中除数为什么是n-1? 假设X为独立同分布的一组随机变量,总体为M,随机抽取N个随机变量构成一个样本,和是总体的均值和方差, 是常…

Apollo自动驾驶入门课程第④讲 — 感知(上)

目录 1. 感知的概述 2. 计算机视觉 3. 摄像头图像 4. LiDAR图像 5. 机器学习 6. 神经网络 7. 反向滤波法 本文转自微信公众号:Apollo开发者社区 原创: 阿波君 Apollo开发者社区 8月23日 上一篇文章中,我们发布了无人驾驶技术的 定位篇…

网络编程懒人入门(二):快速理解网络通信协议(下篇)

转自即时通讯网:http://www.52im.net/ 原作者:阮一峰(ruanyifeng.com),本文由即时通讯网重新整理发布,感谢原作者的无私分享。 1、前言 本文上篇《网络编程懒人入门(一):快速理解网络通信协议&#xff0…

为什么说逻辑回归LR是线性分类器?

问题描述:为什么说逻辑回归LR是非常典型的线性分类器? 首先,我们要弄明白区分线性与非线性分类器的标准是什么?是决策边界(Decision Boundary) 以二分类(LR可以用于多分类)为例进行…

朴素贝叶斯算法注意事项(有待完善)

1.朴素贝叶斯算法的优缺点总结: 优点: 朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率;分类速度快,准确度高;对缺失数据不太敏感,算法简单,常用于文本分类(如新闻…

网络编程懒人入门(三):快速理解TCP协议一篇就够

转自即时通讯网:http://www.52im.net/ 原作者:阮一峰(ruanyifeng.com),本文由即时通讯网重新整理发布,感谢原作者的无私分享。 1、前言 本系列文章的前两篇《网络编程懒人入门(一):快速理解网络通信协议…

分类问题的模型评估指标总结

在分类任务下,预测结果(Predicted Condition)与正确标记(True Condition)之间存在四中不同的组合,构成混淆矩阵(可适用于多分类),通常有这几种主要模型评估指标:精确率(查的准)、召回率(查的全对正样本的区分能力)、F1值(反映模型…

nltk安装punkt等语料库时报SSL错误完美解决方案及离线安装方法

nltk是NLP领域中一个比较通用的国际分词工具,但是使用时往往依赖语料库数据包,需要安装到本地,以下介绍在线安装和离线安装两种方式: (ps:对NLP感兴趣的朋友可以相互学习,我的微信号&#xff1…

7. Deep Learning From Scratch

Intro 这是深度学习第7课。 到目前为止,您构建的模型依赖于预先训练的模型。 但它们不是许多用例的理想解决方案。 在本课程中,您将学习如何构建全新的模型。 Lesson [1] from IPython.display import YouTubeVideo YouTubeVideo(YbNE3zhtsoo, widt…

最实用的Git命令总结:新建本地分支、远程分支、关联和取消关联分支、清除本地和远程分支、合并分支、版本还原、tag命令、中文乱码解决方案、如何fork一个分支和修改后发起合并请求

1.常用命令git、tag整理 1、新建分支本地分支 git branch <branch-name>远程分支 git push origin <branch-name>:<new-branch-name> 2、删除分支本地分支 git branch -d <branch-name> 或 git branch -D <branch-name>远程分支 git push o…

Java基础部分快速复习(以前复习的时候放在自己的新浪博客上)

工作后Java基本没有用到&#xff0c;有时候自己也会把基础过一遍&#xff0c;下面的链接是以前重温的时候整理的Java基础最核心部分的知识点和代码示例放在自己的新浪博客上&#xff0c;如果以后有需要&#xff0c;直接从这里进入&#xff0c;可以快速复习&#xff0c;节省时间…

SQL基础用法总结(以前复习的时候放在自己的新浪博客上)

工作后主要做移动端和前端这一块&#xff0c;后端的知识都是靠自己学习积累的&#xff0c;下面的链接是以前重温的时候整理的SQL基础最核心部分的知识点和代码示例放在自己的新浪博客上&#xff0c;如果以后有需要&#xff0c;直接从这里进入&#xff0c;可以快速复习&#xff…