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,一经查实,立即删除!

相关文章

0.Overview----Machine Learning

本文为Kaggle Learn的Machine Learning课程的中文翻译,原文链接为:https://www.kaggle.com/learn/machine-learning 1.How Models Work The first step if youre new to machine learning 2.Explore Your Data Load data and set up your environment …

【2018ACM山东省赛 - C】Cities(最小生成树变形优化,贪心思维)

题干: Problem Description There are nnn cities in Byteland, and the ithi_{th}ith​ city has a value aia_iai​. The cost of building a bidirectional road between two cities is the sum of their values. Please calculate the minimum cost of connec…

项目总结1:微信扫码自动识别设备类型并跳转到相应的应用下载页面(apk或App Store)之解决方案

问题分析:普通页面一般无法调用微信的扫一扫接口,从而否定通过微信扫一扫功能给我们判断当前扫码的设备类型。 解决方案:通过应用下载页面自身来获取当前访问的客户端设备类型(iPhone、Android、iPad),然后…

《TCP/IP详解》学习笔记(六):UDP 协议

UDP 简要介绍 UDP 是传输层协议,和 TCP 协议处于一个分层中,但是与 TCP 协议不同,UDP 协议并不提供超时重传,出错重传等功能,也就是说其是不可靠的协议。 UDP 协议头 1UDP 端口号 由于很多软件需要用到 UDP 协议&am…

【2018ACM山东省赛 - E】Sequence(树状数组,思维,优化)

题干&#xff1a; We define an element aia_iai​ in a sequence "good", if and only if there exists a j(1≤j<i)j(1\le j < i)j(1≤j<i) such that aj<aia_j < a_iaj​<ai​. Given a permutation ppp of integers from 111 to nnn. Remove …

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

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

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

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

【2018ACM山东省赛 - G】Games(Nim博弈 + dp)

题干&#xff1a; Problem Description Alice and Bob are playing a stone game. There are nnn piles of stones. In each turn, a player can remove some stones from a pile (the number must be positive and not greater than the number of remaining stones in the …

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

题目描述&#xff1a; 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 …

项目总结3:ionic3开发的App在启动过程中部分手机出现白屏或黑屏问题之终极解决方案

问题场景&#xff1a;采用ionic3开发的App&#xff0c;当项目比较大的时候&#xff0c;会出现部分真机设备在启动的过程中有白屏或黑屏的情况。 原因预测&#xff1a;个别手机&#xff0c;尤其是安卓手机的性能比较差&#xff0c;App在启动后进入首页或登录页前的初始化工作还…

1.Intro to Deep Learning and Computer Vision

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

【POJ - 2253】Frogger(floyd,或 部分瓶颈生成树的最大边)

题干&#xff1a; 湖中有n块石头&#xff0c;编号从1到n&#xff0c;有两只青蛙&#xff0c;Bob在1号石头上&#xff0c;Alice在2号石头上&#xff0c;Bob想去看望Alice&#xff0c;但由于水很脏&#xff0c;他想避免游泳&#xff0c;于是跳着去找她。但是Alice的石头超出了他…

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

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

2.Building Models from Convolutions

Intro 这是深度学习课程的第2课 在本课程结束时&#xff0c;您将了解如何将卷积结合起来&#xff0c;以实现计算机视觉中的超人成就。 Lesson [1] from IPython.display import YouTubeVideo YouTubeVideo(ToBPiUlLFEY, width800, height450) Keep Going 现在你理解了模…

*【POJ - 2796】 Feel Good (前缀和优化+单调栈维护)

题干&#xff1a; Feel Good Time Limit: 3000MS Memory Limit: 65536KTotal Submissions: 12409 Accepted: 3484Case Time Limit: 1000MS Special Judge Description Bill is developing a new mathematical theory for human emotions. His recent investigations are dedi…

SpringMVC配置视图的直接映射view-controller命名空间

通常情况下&#xff0c;如果直接通过url来访问具体的视图会报404错误&#xff0c;这个时候最容易想到的解决办法是通过转发或重定向机制&#xff0c;也就说走一遍目标控制器方法拦截一次。但是最好的方法是配置视图的直接映射关系。 <mvc: view-controller path"url访…

【nyoj-456】 邮票分你一半 (dp,0-1背包的中点问题)

题干&#xff1a; 邮票分你一半 时间限制&#xff1a;1000 ms | 内存限制&#xff1a;65535 KB 难度&#xff1a;3 描述 小珂最近收集了些邮票&#xff0c;他想把其中的一些给他的好朋友小明。每张邮票上都有分值&#xff0c;他们想把这些邮票分成两份&#xff0c;并且使…

Angular中父子组件传值@Input @Output @ViewChild最全面最简单的总结

父组件传递给子组件&#xff1a; 值传递方式&#xff1a;Input既可以传递数据也可以传递方法 传递数据&#xff08;不举例了&#xff09;传递方法 // 父组件定义方法 parentRun(){alert(这是父组件的 run 方法); } 调用子组件时传入当前方法&#xff08;是传递方法不是调用方…

《TCP/IP详解》学习笔记(七):广播和多播、IGMP协议

单播&#xff0c;多播&#xff0c;广播的介绍 1单播(unicast) 单播是说&#xff0c;对特定的主机进行数据传送。例如给某一个主机发送 IP 数据包。这时候&#xff0c;数据链路层给出的数据头里面是非常具体的目的地址&#xff0c;对于以太网来说&#xff0c;就是网卡的 MAC 地…

【 POJ - 3628 】Bookshelf 2(dfs 或 dp,0-1背包)

题干&#xff1a; Farmer John recently bought another bookshelf for the cow library, but the shelf is getting filled up quite quickly, and now the only available space is at the top. FJ has N cows (1 ≤ N ≤ 20) each with some height of Hi (1 ≤ Hi ≤ 1,0…