《Kaggle教程 机器学习中级》系列课程目录
Kaggle教程 机器学习中级6 XGBoost
Kaggle教程 机器学习中级7 Data Leakage

在本教程中,您将了解什么是数据泄漏以及如何防止数据泄漏。如果你不知道如何防止它,泄漏将频繁出现,它将以微妙和危险的方式破坏你的模型。这是数据科学家最重要的概念之一。

1. 介绍

当你的训练数据包含了目标的信息时,就会发生data leakage 数据泄漏(或泄漏),但是当模型用于预测时,就没有类似的数据可用了。这将导致训练集(甚至可能是验证数据)上的高性能,但是模型在生产中表现很差。

换句话说,泄漏导致模型看起来很精确,直到您开始使用模型做出决策,然后模型变得非常不精确。

主要有两种类型的泄漏:target leakage(目标泄漏)和 train-test contamination.(训练测试污染)。

2 .target leakage(目标泄漏)

当预测器包含在进行预测时不可用的数据时,就会发生目标泄漏。重要的是要根据数据可用的时间或时间顺序来考虑目标泄漏,而不仅仅是某个特性是否有助于做出良好的预测。

举个例子会有帮助。假设您想要预测谁会患肺炎。原始数据的前几行是这样的:

got_pneumonia age weight male took_antibiotic_medicine
False 65 100 False False
False 72 130 True False
True 58 100 False True

人们在患肺炎后服用抗生素以恢复健康。原始数据显示这些列之间有很强的关系,但是在确定got_pneumonia的值之后,took_antibiotic_medicine经常被更改。这是目标泄漏。

该模型将会看到,任何对took_antibiotic_medicine值为False的人都没有患肺炎。由于验证数据来自与训练数据相同的来源,模式将在验证中重复,并且模型将具有良好的验证(或交叉验证)分数。

为了防止这种类型的数据泄漏,应该排除在实现目标值之后更新(或创建)的任何变量

3. Train-Test Contamination (训练测试污染)

当您不小心区分培训数据和验证数据时,就会发生另一种类型的泄漏。

回想一下,验证意味着度量模型如何处理以前没有考虑过的数据。如果验证数据影响预处理行为,则可以以微妙的方式破坏此过程。这有时被称为Train-Test Contamination

例如,假设您在调用train_test_split()之前运行预处理(比如为缺失的值拟合估算值)。最终的结果吗?您的模型可能会得到很好的验证分数,这给了您很大的信心,但是当您部署它来做决策时,它的性能很差。

毕竟,您将来自验证或测试数据的数据合并到如何进行预测中,所以即使不能泛化到新数据,也可以很好地处理特定的数据。当您进行更复杂的特性工程时,这个问题会变得更微妙(也更危险)。

如果您的验证基于简单的训练-测试分离,则从任何类型的拟合中排除验证数据,包括预处理步骤的拟合。如果您使用scikit-learn管道,这将更加容易。在使用交叉验证时,在管道中进行预处理更为重要!

4. 例子

在本例中,您将了解一种检测和删除目标泄漏的方法

我们将使用一个关于信用卡应用程序的数据集,并跳过基本的数据设置代码。最终的结果是,关于每个信用卡应用程序的信息存储在一个DataFrame x中。我们将使用它来预测y Series中哪些应用程序被接受。

import pandas as pd# 读取数据
data = pd.read_csv('../input/aer-credit-card-data/AER_credit_card_data.csv', true_values = ['yes'], false_values = ['no'])# 选择目标
y = data.card# 选择预测
X = data.drop(['card'], axis=1)print("Number of rows in the dataset:", X.shape[0])
X.head()'''
Number of rows in the dataset: 1319reports  age income  share   expenditure owner   selfemp dependents  months  majorcards  active
0   0   37.66667    4.5200  0.033270    124.983300  True    False   3   54  1   12
1   0   33.25000    2.4200  0.005217    9.854167    False   False   3   34  1   13
2   0   33.66667    4.5000  0.004156    15.000000   True    False   4   58  1   5
3   0   30.50000    2.5400  0.065214    137.869200  False   False   0   25  1   7
4   0   32.16667    9.7867  0.067051    546.503300  True    False   2   64  1   5
'''

由于这是一个小数据集,我们将使用交叉验证来确保模型质量的准确度量。

from sklearn.pipeline import make_pipeline
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score# Since there is no preprocessing, we don't need a pipeline (used anyway as best practice!)
my_pipeline = make_pipeline(RandomForestClassifier(n_estimators=100))
cv_scores = cross_val_score(my_pipeline, X, y, cv=5,scoring='accuracy')print("Cross-validation accuracy: %f" % cv_scores.mean())'''
Cross-validation accuracy: 0.979525
'''

根据经验,你会发现很少有模型在98%的时间内都是准确的。这种情况确实会发生,但我们应该更仔细地检查数据是否有目标泄漏,这种情况并不常见。

下面是数据的摘要,你也可以在data选项卡中找到:

  • card: 1如果信用卡申请被接受,0如果不被接受
  • reports: 大量的负面报道
  • age: 年龄是一年的十二分之一
  • income: 年收入(除以10000)
  • share: 每月信用卡支出与年收入之比
  • expenditure: 平均每月信用卡支出
  • owner: 1如果有房子,0如果租房子
  • selfempl: 自雇1人,不自雇0人
  • dependents: 1 +家属人数
  • months: 在现址住了几个月
  • majorcards: 持有的主要信用卡数量
  • active: 活跃的信用帐户数量

有几个变量看起来很可疑。例如,支出是指此卡上的支出还是应用之前使用的卡片上的支出?

在这一点上,基本的数据比较是很有帮助的:

expenditures_cardholders = X.expenditure[y]
expenditures_noncardholders = X.expenditure[~y]print('Fraction of those who did not receive a card and had no expenditures: %.2f' \%((expenditures_noncardholders == 0).mean()))
print('Fraction of those who received a card and had no expenditures: %.2f' \%(( expenditures_cardholders == 0).mean()))'''
Fraction of those who did not receive a card and had no expenditures: 1.00
Fraction of those who received a card and had no expenditures: 0.02
'''

如上所示,没有收到信用卡的人没有支出,而收到信用卡的人中只有2%没有支出。我们的模型似乎有很高的准确性,这并不奇怪。但这似乎也是目标泄露的一个例子,其中支出可能意味着他们申请的卡上的支出。

由于份额部分由支出决定,它也应该被排除在外。活动变量和主卡不太清楚,但从描述来看,它们听起来令人担忧。在大多数情况下,如果您无法找到创建数据的人以了解更多信息,那么安全总比遗憾好。

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

# 从数据集中删除泄漏的预测器
potential_leaks = ['expenditure', 'share', 'active', 'majorcards']
X2 = X.drop(potential_leaks, axis=1)# 删除泄漏预测因子后评估模型
cv_scores = cross_val_score(my_pipeline, X2, y, cv=5,scoring='accuracy')print("Cross-val accuracy: %f" % cv_scores.mean())'''
Cross-val accuracy: 0.828651
'''

这个精度要低一些,这可能会令人失望。但是,在新应用程序中,我们可以期望它在80%的情况下是正确的,而漏出的模型可能比这更糟(尽管它在交叉验证中的得分更高)。

5. 结论

在许多数据科学应用中,数据泄漏可能是数百万美元的错误。仔细分离培训和验证数据可以防止培训测试污染,管道可以帮助实现这种分离。同样,结合谨慎、常识和数据探索可以帮助识别目标泄漏。

===============================================================================================
这似乎仍然很抽象。尝试通过本练习中的示例来提高您识别目标泄漏和训练-测试污染的技能!

Kaggle教程 机器学习中级7 Data Leakage相关推荐

  1. Kaggle教程 机器学习中级7 数据泄露

    在本课程中,你将学习如何什么是数据泄露以及如何避免数据泄露.如果你不知道如何防止,数据泄漏将频繁出现,它将以微妙和危险的方式破坏你的模型.这是数据科学家最重要的概念之一. 1.介绍 数据泄露是指,在训 ...

  2. Kaggle教程 机器学习中级3 分类变量

    转载请注明出处:https://leytton.blog.csdn.net/article/details/101350667 如果本文对您有所帮助,请点个赞让我知道哦

  3. Kaggle教程 机器学习中级4 Pipeline

    转载请注明出处:https://leytton.blog.csdn.net/article/details/101351814 如果本文对您有所帮助,请点个赞让我知道哦

  4. Kaggle教程 机器学习中级2 缺失值处理

    转载请注明出处:https://leytton.blog.csdn.net/article/details/101349794 如果本文对您有所帮助,请点个赞让我知道哦

  5. Kaggle教程 机器学习入门学习笔记

    机器学习入门学习笔记 [跳转]<Kaggle教程 机器学习入门>系列课程目录 >> 决策树 简介:是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零 ...

  6. Kaggle教程 机器学习入门3 你的第一个机器学习模型

    转载请注明出处:https://leytton.blog.csdn.net/article/details/101171099 如果本文对您有所帮助,请点个赞让我知道哦

  7. 机器学习中的数据泄露(Data Leakage)

    在 Kaggle竞赛中出现过奇怪的现象:一只队伍,靠着对极个别特征feature的充分利用(被称为魔法属性),立即将对手超越,成功霸占冠军位置.然而,这可能是竞赛方数据准备过程中出现的失误,使模型沿着 ...

  8. 机器学习中级教程 7.数据泄漏

    机器学习中级教程 1.介绍 2.缺失值 3.分类变量 4.管道(Pipelines) 5.交叉验证 6.梯度提升(XGBoost) 7.数据泄漏 在本教程中,您将了解什么是数据泄漏以及如何防止它.如果 ...

  9. 【Kaggle】Intermediate Machine Learning(XGBoost + Data Leakage)

    文章目录 6. XGBoost 7. Data Leakage 数据泄露 上一篇:[Kaggle]Intermediate Machine Learning(管道+交叉验证) 6. XGBoost 参 ...

最新文章

  1. .data和.text段合并
  2. 智能角阀中的电子芯片_电子科技大学胡维昊教授:人工智能在可再生能源系统中的应用...
  3. Python3的urllib.parse常用函数小结
  4. Traffic Simulator Applet(交通模拟器小程序)
  5. 为什么要做一场WebRTC主题的大会?
  6. redis memcache 性能比较
  7. 大项目之网上书城(十二)——完成啦
  8. Log4j(二)—— Log4j基本使用方法
  9. 网站短信验证码接口收费标准
  10. java魔兽争霸_GitHub - mzhg/jw3gparser: Java解析《魔兽争霸3》游戏录像工具
  11. ADB连接手机的三种方式USB、WLAN、WIFI
  12. 计算机远程桌面连接软件,windows7远程桌面连接软件 提取自最新windows7,可运行于XP...
  13. 用python画好看的图片,几张好看的HTML图片和利用Python画的好看的图
  14. 水管工游戏(随机地图版)
  15. linux deepin配置优化:解决deepin v20.5不能自动降频导致CPU风扇一直狂转吹热气的问题
  16. 【米思米工业产品知识分享】- 轴承的分类与主要用途
  17. python合并多个excel表到一张表中(有表头)
  18. 错过两个时代的IBM,能否用区块链抢占下个时代
  19. hadoop暂时永久关闭安全模式
  20. requests模块02

热门文章

  1. element-plus小demo
  2. 聊聊Redis的各种集群方案、及优缺点对比
  3. 钉钉如何调整组织架构_[钉钉组织架构设置]如何设置组织架构 组织架构设置的五个步骤...
  4. Vue中使用微信JSDK实现图片上传
  5. MacOS 校验iso sha256值、md5值,linux
  6. 微信开发者工具测试小程序
  7. 未来的事业计算机工程师英语作文,英语作文:我未来的事业 My Future Career
  8. Gitlab的自动流水线搭建
  9. Hexo博客添加live2d卡通人物
  10. Oracle中如何用一个表的数据更新另一个表中的数据_转载