业界 | 如何达到Kaggle竞赛top 2%?这里有一篇特征探索经验帖

选自Towards Data Science

作者: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

原文发布于微信公众号 - 机器之心(almosthuman2014)

原文发表时间:2018-11-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏鸿的学习笔记

Yoshua Bengio关于深度学习结构的综述

深度学习方法旨在学习特征层次,其具有由较低层特征的组合形成的较高层级的特征。在多个抽象级别自动学习特征允许系统去学习将输入直接从数据映射到输出的复杂函数,而不完...

621
来自专栏ATYUN订阅号

数据科学家应该知道的10个深度学习的高级架构!

随着深度学习不断地产生新进展,要跟上时代的脚步变得异常困难。几乎每天都有创新,或是产生一种新的深度学习的应用。 这篇文章包含了最近深度学习的一些进展。为了保持文...

3895
来自专栏机器之心

从大间隔分类器到核函数:全面理解支持向量机

28610
来自专栏AI派

业界 | 如何达到Kaggle竞赛top 2%?这里有一篇特征探索经验帖

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

933
来自专栏机器学习算法与Python学习

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

本文作者 Abhay Pawar 多次参加 Kaggle 竞赛,并在 Instacart Market Basket Analysis 竞赛中拿到 top 2%...

1134
来自专栏IT大咖说

百度:深度学习模型设计的经验分享

内容来源:2018 年 05 月 18 日,百度资深研发工程师刘凡平在“百度深度学习公开课·杭州站:AI工程师的快速进阶之路”进行的《深度学习模型设计经验分享》...

1311
来自专栏专知

【AlphaGo Zero 核心技术-深度强化学习教程笔记07】策略梯度

【导读】Google DeepMind在Nature上发表最新论文,介绍了迄今最强最新的版本AlphaGo Zero,不使用人类先验知识,使用纯强化学习,将价值...

2954
来自专栏量子位

深度学习在推荐系统上的应用

作者:陈仲铭 量子位 已获授权编辑发布 转载请联系原作者 深度学习最近大红大紫,深度学习的爆发使得人工智能进一步发展,阿里、腾讯、百度先后建立了自己的AI La...

3865
来自专栏磐创AI技术团队的专栏

粒子群优化算法(PSO)之基于离散化的特征选择(FS)(二)

前面我们介绍了特征选择(Feature Selection,FS)与离散化数据的重要性,总览的介绍了PSO在FS中的重要性和一些常用的方法。今天讲一讲FS与离散...

3405
来自专栏AI科技大本营的专栏

最新论文解读 | 神经网络“剪枝”的两个方法

编译 | AI科技大本营 参与 | 刘 畅 编辑 | 明 明 【AI科技大本营导读】本文介绍了两篇自动学习神经网络架构方向的最新方法,他们主要是通过计算扔掉...

3855

扫码关注云+社区