作者| Abhay Pawar    编译 | 机器之心

本文作者 Abhay Pawar 多次参加 Kaggle 竞赛,并在 Instacart Market Basket Analysis 竞赛中拿到 top 2% 的名次。他在多年竞赛中总结出了一套特征探索和构建更好机器学习模型的标准方式,本文将介绍这套方法。

在数值数据上构建任意监督学习模型的一个重要方面是理解特征。查看模型的部分依赖图可帮助理解任意特征对模型输出的影响。

图源:http://scikit-learn.org/stable/auto_examples/ensemble/plot_partial_dependence.html

但是,部分依赖图存在一个问题,即它们是使用训练好的模型创建的。如果我们可以从训练数据中直接创建部分依赖图,那么它将帮助我们更好地理解底层数据。事实上,它能够帮助你做好以下事情:

  1. 特征理解

  2. 识别带噪声的特征

  3. 特征工程

  4. 特征重要性

  5. 特征 debug

  6. 泄露检测和理解

  7. 模型监控

为了使其更加易于使用,作者将这些技术封装进一个 Python 包 featexp 中,本文将介绍如何使用它进行特征探索。本文使用的是 Kaggle Home Credit Default Risk 竞赛的应用数据集。该竞赛的任务是使用给定数据预测违约者。

featexp:https://github.com/abhayspawar/featexp

1. 特征理解

特征散点图 vs. 无用的目标

如果依赖变量(目标)是二元的,则散点图无效,因为所有点要么是 0 要么是 1。对于连续目标来说,数据点太多会造成难以理解目标 vs 特征趋势。featexp 创建了更好的图,可帮助解决该问题。我们来试一下!

from featexp import get_univariate_plots

# Plots drawn for all features if nothing is passed in feature_list parameter.
get_univariate_plots(data=data_train, target_col='target', 
                     features_list=['DAYS_BIRTH'], bins=10)

DAYS_BIRTH (age) 的特征 vs 目标图

featexp 为数值特征创建了同等人口数量的 bin(x 轴),然后计算每个 bin 的目标平均值,再绘制出来(如上图左)。在我们的案例中,目标平均值是违约率。该图告诉我们年龄越大的客户违约率越低。这些图帮助我们理解特征表达的意义,及其对模型的影响。右图显示了每个 bin 中客户的数量。

2. 识别带噪声的特征

带噪声的特征导致过拟合,识别它们并非易事。在 featexp 中,你可以输出一个测试集(或者验证集),对比训练/测试集中的特征趋势来确定带噪声的特征。

get_univariate_plots(data=data_train, target_col='target', data_test=data_test, features_list=['DAYS_EMPLOYED'])

训练和测试特征趋势对比。

featexp 计算两个指标(如上图所示),来帮助测量噪声:

  1. 趋势相关度(见测试图):如果某个特征未体现目标在训练集和测试集中的同样趋势,它会导致过拟合,因为模型会学习一些在测试数据中并不使用的东西。趋势相关度有助于理解训练/测试趋势的相似度,如何利用训练和测试集的 bin 的平均目标值来计算趋势相关度。上图中的特征相关度为 99%,几乎没有噪声。

  2. 趋势变化:趋势方向中突然和重复的变化可能表明有噪声。但是,此类趋势变化也会在 bin 的人口数量与其它特征不同时,导致其违约率无法与其它 bin 进行对比。

下图中的特征没有展现同样的趋势,因为趋势相关度为 85%。这两个指标可用于删除带噪声的特征。

带噪声特征示例。

当特征很多且相互关联时,删除低趋势相关度特征的效果很好。它会带来更少的过拟合,其它相关特征可以避免信息损失。同时需要注意不要删除太多重要特征,因为这可能导致性能下降。此外,你无法利用特征重要性来判断特征是否带噪声,因为重要的特征也会带噪声!

使用不同时间段的测试数据效果更好,因为你可以借此确定特征趋势是否一直如此。

featexp 中的 get_trend_stats() 函数返回展示趋势相关度的数据帧,并随着特征而改变。

from featexp import get_trend_stats
stats = get_trend_stats(data=data_train, target_col='target', data_test=data_test)

get_trend_stats() 返回的数据帧。

下面我们就试着删除数据中低趋势相关度的特征,然后看结果是否有所改进。

使用趋势相关度的不同特征选择的 AUC。

我们可以看到,趋势相关度阈值越高,排行榜(LB)AUC 越高。不删除重要的特征进一步将 LB AUC 提高到 0.74。测试 AUC 的变化与 LB AUC 不同,这一点也很有趣。完整代码详见 featexp_demo notebook:https://github.com/abhayspawar/featexp/blob/master/featexp_demo.ipynb。


3. 特征工程

通过查看这些图所获取的见解可以帮助你创建更好的特征。更好地理解数据将带来更好的特征工程。此外,它还可以帮助你改善现有特征。下面我们来看另一个特征 EXT_SOURCE_1:

EXT_SOURCE_1 的特征 vs. 目标图。

具备高 EXT_SOURCE_1 的客户具备较低的违约率。但是,第一个 bin(违约率约 8%)没有遵循该特征趋势(向上升后下降)。它的负值是-99.985,而且人口数量较多。这可能表明这些是特殊的值,因此不遵循特征趋势。幸运的是,非线性模型在学习该关系方面不会有问题。而对于线性模型(如 logistic 回归),此类特殊值和空缺值应该采用类似样本的默认值进行估计,而不是特征平均值。

4. 特征重要性

featexp 还可以帮助衡量特征重要性。DAYS_BIRTH 和 EXT_SOURCE_1 都具备很好的趋势。但是 EXT_SOURCE_1 的人口数量集中于特殊值 bin,这表明其重要性可能不如 DAYS_BIRTH。基于 XGBoost 模型的特征重要性,DAYS_BIRTH 的重要性高于 EXT_SOURCE_1。

5. 特征 debug

查看 featexp 图可以帮助你捕捉复杂特征工程中的 bug:

零变化特征仅显示单个 bin。

检查一下特征的人数分布看起来是否正确。由于存在一些小 bug,我个人经常遭遇上述极端情况。

在看这些图之前,一定要假设特征趋势会是什么样子。如果特征趋势看起来不像你期望的那样,可能表示其中存在一些问题。坦率地说,这种假设趋势的过程使得构建 ML 模型更加有趣!

6 泄露检测

从目标到特征的数据泄露会导致过拟合。泄露特征具有很高的特征重要性,但很难理解为什么特征会发生泄露。查看下列 featexp 图可以帮助你理解。

下面的特征在「Null」bin 中违约率为 0%,在其它 bin 中为 100%。很明显,这是极端的泄露案例。该特征只有在客户违约时才有价值。根据特征是什么,这可能是因为 bug 或者该特征只为违约者填充(在这种情况下它会下降)。弄清楚特征泄露的原因可以加速 debug。

理解特征为何泄露。

7 模型监控

由于 featexp 计算两个数据集之间的趋势相关性,它可以很轻易地用于模型监控。每次模型被重新训练之后,就可以把新的训练数据与测试好的训练数据(通常从第一次构建模型开始训练数据)进行对比。趋势相关性能够帮助你监控特征信息与目标的关系是否发生任何变化。

原文链接:https://towardsdatascience.com/my-secret-sauce-to-be-in-top-2-of-a-kaggle-competition-57cff0677d3c


推荐阅读

五种类型的程序员,你属于哪一种?

Chrome 的哪些功能改变了我们浏览网页的方式?

338页新书《Deep Learning in Natural Language Processing》

244页MT学术论文写作方法和技巧【下载】

如何用一段简单的代码讲述一个悲伤的故事?

简单粗暴的TensorFlow Eager 教程【下载 |】

Kaggle如何取得top 2%,这篇文章告诉你!相关推荐

  1. lasso特征选择python_特征选择怎么做?这篇文章告诉你

    原标题:特征选择怎么做?这篇文章告诉你 照片由 Clem Onojeghuo 发布在 Unsplash 上面 作者 | Pier Paolo Ippolito 翻译 | Skura 编辑 | 唐里 原 ...

  2. 上台演讲怎么做?这篇文章告诉你

    上台演讲怎么做?这篇文章告诉你 公众号:"王堃阳口才前线"始于2003年,学演说找王堃阳,专治各种不会说! 演讲者很可能是突然被"点将",而没有做好思想准备.心 ...

  3. 这篇文章告诉你表格识别的软件有哪些

    这篇文章告诉你表格识别的软件有哪些 大家在学习和工作过程中,会时常遇到需要整理表格信息的时候,有时需要处理的表格非常的多,但我们自己的时间又比较有限.其实我们可以使用能够识别表格的软件来帮助我们进行快 ...

  4. 这篇文章告诉你开发个人小程序要花多少钱

    微信小程序大家都不陌生,只是很多人对它有误解,以为只有企业和商家才能注册开发.其实个人也可以注册小程序!而且门槛很低,不需要懂什么技术或者设计知识.激动吗?很多小白人不太懂做个人小程序,所以我来告诉你 ...

  5. 【完结】12篇文章告诉你深度学习理论应该学到什么水平

    专栏<AI初识境>正式完结了,在这一个专题中,我们给大家从神经网络背景与基础,讲到了深度学习中的激活函数,池化,参数初始化,归一化,优化方法,正则项与泛化能力,讲到了深度学习中的评测指标, ...

  6. 听说读论文也有trick?这篇文章告诉你深度学习论文阅读最佳姿势

    2020年的今天,我们的专业是deep learning,但是我们要keep learning,每天早上一睁眼,arxiv每天更新上百篇的论文,著名微博博主@爱可可-爱生活保持也在推送最新的deep ...

  7. 图片加水印怎么加?这篇文章告诉你

    现在有越来越多的人从事自媒体,因此每当自己发布的图片上,往往都要加上水印来防止被别人盗用侵权,而相信大多数的人都应该知道可以利用一些加水印的软件来实现,但是你们知道具体如何操作吗?今天就让我来告诉你三 ...

  8. 如何使用 K8s 实现跨集群管理,这篇文章告诉你了!赶紧收藏

    一.背景 集群联邦(Federation)的目的是实现单一集群统一管理多个Kubernetes集群的机制,这些集群可能是跨地区(Region),也可能是在不同公有云供应商上,或者是公司内部自行建立的集 ...

  9. 不知道如何裁剪视频画面尺寸?这篇文章告诉你如何视频裁剪画面

    现在短视频行业盛行,相信应该有不少小伙伴想加入短视频的制作,当我们编辑完视频想上传到短视频平台上,会发现有些平台会限制视频画面的大小,导致视频发布不了,其实我们可以在发布前将视频裁剪至合适大小,那应该 ...

  10. 你的钱为什么会被转走,这篇文章告诉你答案

    本篇文章内容,主要是关于CSRF. 01  什么是CSRF? CSRF,全称Cross-site request forgery,翻译过来就是跨站请求伪造,是指利用受害者尚未失效的身份认证信息(coo ...

最新文章

  1. 女朋友的Mysql练习题
  2. 团队-象棋游戏-设计文档
  3. Java反射机制--笔记
  4. android按钮最底,Android:点击按钮后布局上的动画,最低SDK版本为14
  5. Shell脚本读取Redis键值对
  6. DCMTK:表示增强型CT对象的类
  7. htc u11 android o,HTC U11+和HTC U11有什么区别?对比完秒懂 (全文)
  8. TypeScript Partial 使用的一个小技巧
  9. linux 常用命令01
  10. 只会 Vue 的前端工程师是没有前途的
  11. Focal Loss 分类问题 pytorch实现代码(续3)
  12. bug10-graphviz.backend.ExecutableNotFound: failed to execute [‘dot‘, ‘-Tpdf‘, ‘-O‘, ‘Source.gv‘]
  13. 【车间调度】基于matlab粒子群算法求解6X6车间调度问题【含Matlab源码 411期】
  14. MTK76X8最新Openwrt固件下载
  15. 无密码如何破解PDF加密
  16. win10计算机如何切换用户名,如何修改电脑用户名,win10系统更改用户名方法
  17. 华中科技大学计算机考研信息汇总
  18. Vue图表(v-charts, e-charts)入门安装使用
  19. python打印数字对应的星号_python打印表格式数据-星号或注释
  20. 刹车离合同时踩非常危险

热门文章

  1. 守护地球家园,福泽各国人民,地球币,加油!#地球# 。 ​​​​
  2. 磁盘未知错误解决过程
  3. 所谓情商高,就是会说话2
  4. Opencv 读取灰度图像会识别为3通道问题
  5. 平均股价的时间序列图形_如何用公式表达股票平均价格
  6. CC2640R2F学习笔记(1)——搭建环境、编译烧写
  7. 全排列与逆序数的组合
  8. 【C++】类和对象【中篇】--C++六个默认成员函数以及const成员函数
  9. 洛谷 P3338【FFT】
  10. 我的职场-初入职场遇到一帮好兄弟