Kaggle教程 机器学习中级7 Data Leakage
《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相关推荐
- Kaggle教程 机器学习中级7 数据泄露
在本课程中,你将学习如何什么是数据泄露以及如何避免数据泄露.如果你不知道如何防止,数据泄漏将频繁出现,它将以微妙和危险的方式破坏你的模型.这是数据科学家最重要的概念之一. 1.介绍 数据泄露是指,在训 ...
- Kaggle教程 机器学习中级3 分类变量
转载请注明出处:https://leytton.blog.csdn.net/article/details/101350667 如果本文对您有所帮助,请点个赞让我知道哦
- Kaggle教程 机器学习中级4 Pipeline
转载请注明出处:https://leytton.blog.csdn.net/article/details/101351814 如果本文对您有所帮助,请点个赞让我知道哦
- Kaggle教程 机器学习中级2 缺失值处理
转载请注明出处:https://leytton.blog.csdn.net/article/details/101349794 如果本文对您有所帮助,请点个赞让我知道哦
- Kaggle教程 机器学习入门学习笔记
机器学习入门学习笔记 [跳转]<Kaggle教程 机器学习入门>系列课程目录 >> 决策树 简介:是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零 ...
- Kaggle教程 机器学习入门3 你的第一个机器学习模型
转载请注明出处:https://leytton.blog.csdn.net/article/details/101171099 如果本文对您有所帮助,请点个赞让我知道哦
- 机器学习中的数据泄露(Data Leakage)
在 Kaggle竞赛中出现过奇怪的现象:一只队伍,靠着对极个别特征feature的充分利用(被称为魔法属性),立即将对手超越,成功霸占冠军位置.然而,这可能是竞赛方数据准备过程中出现的失误,使模型沿着 ...
- 机器学习中级教程 7.数据泄漏
机器学习中级教程 1.介绍 2.缺失值 3.分类变量 4.管道(Pipelines) 5.交叉验证 6.梯度提升(XGBoost) 7.数据泄漏 在本教程中,您将了解什么是数据泄漏以及如何防止它.如果 ...
- 【Kaggle】Intermediate Machine Learning(XGBoost + Data Leakage)
文章目录 6. XGBoost 7. Data Leakage 数据泄露 上一篇:[Kaggle]Intermediate Machine Learning(管道+交叉验证) 6. XGBoost 参 ...
最新文章
- .data和.text段合并
- 智能角阀中的电子芯片_电子科技大学胡维昊教授:人工智能在可再生能源系统中的应用...
- Python3的urllib.parse常用函数小结
- Traffic Simulator Applet(交通模拟器小程序)
- 为什么要做一场WebRTC主题的大会?
- redis memcache 性能比较
- 大项目之网上书城(十二)——完成啦
- Log4j(二)—— Log4j基本使用方法
- 网站短信验证码接口收费标准
- java魔兽争霸_GitHub - mzhg/jw3gparser: Java解析《魔兽争霸3》游戏录像工具
- ADB连接手机的三种方式USB、WLAN、WIFI
- 计算机远程桌面连接软件,windows7远程桌面连接软件 提取自最新windows7,可运行于XP...
- 用python画好看的图片,几张好看的HTML图片和利用Python画的好看的图
- 水管工游戏(随机地图版)
- linux deepin配置优化:解决deepin v20.5不能自动降频导致CPU风扇一直狂转吹热气的问题
- 【米思米工业产品知识分享】- 轴承的分类与主要用途
- python合并多个excel表到一张表中(有表头)
- 错过两个时代的IBM,能否用区块链抢占下个时代
- hadoop暂时永久关闭安全模式
- requests模块02
热门文章
- element-plus小demo
- 聊聊Redis的各种集群方案、及优缺点对比
- 钉钉如何调整组织架构_[钉钉组织架构设置]如何设置组织架构 组织架构设置的五个步骤...
- Vue中使用微信JSDK实现图片上传
- MacOS 校验iso sha256值、md5值,linux
- 微信开发者工具测试小程序
- 未来的事业计算机工程师英语作文,英语作文:我未来的事业 My Future Career
- Gitlab的自动流水线搭建
- Hexo博客添加live2d卡通人物
- Oracle中如何用一个表的数据更新另一个表中的数据_转载