进入Kaggel竞赛前2%的秘方

请点击上方“AI公园”,关注公众号


作者:Abhay Pawar

编译:ronghuaiyang

kaggle的比赛有趣又让人上瘾!过去的几年里,我开发了一些探索特征和构建更好的机器学习模型的标准的方法。这些简单而强大的技巧帮助我在Instacart Market Basket Analysis竞赛中进入了2%,而且在kaggle之外,也用的很好。让我们开始吧。

创建任何一个基于数字数据的监督学习模型时候,其中一个最重要的因素就是理解特征。通过查看模型中的局部依赖性可以帮助我们理解模型的输出是如何根据输入来改变的。

640?wx_fmt=png

但是,问题在于,这样的图是在训练完模型以后创建的。如果我们可以从训练数据中直接得到这样的图,就可以帮助我们更好的理解这些数据。事实上,可以帮助你以下的这些事情:

  1. 特征理解

  2. 确定噪声特征(最有趣的部分)

  3. 特征工程

  4. 特征重要性

  5. 特征调试

  6. 渗透检测和理解

  7. 模型的监测

为了让这些更加容易接受,我决定把这些技术放在一个python包里,叫做featexp,在这篇文章里,我们会看到如何用这个东西来进行特征探索。我们将会使用Home Credit Default Risk比赛的数据。比赛的任务是使用给定的数据预测违约的人。

1.特征理解

640?wx_fmt=png

如果目标是个二值的,散点图没什么用,因为这些点要么是1,要么是0。对于连续型的目标,数据点太多的话,又很难理解目标和特征之间的趋势。Featexp可以创建一个更好的图来处理这个问题,我们试试看:

 
 

640?wx_fmt=png

Featexp创建了一个等间隔的bins的数值特征,然后计算每个bin的均值,然后画到左边,在我们的例子中,目标的均值代表了违约的概率。这个图告诉我们,负值越大(越往左,年龄越大)的人,违约的概率越小。这个图帮助我们理解模型和数据,告诉我们数据如何影响模型的结果。右边的图显示了每个bin中的客户的数量,所有年龄段的人几乎是相等的。

1.确定噪声特征

噪声特征会导致过拟合,确定噪声特征并不容易。在featexp中,可以通过一个测试集对比训练和测试的特征趋势来确定噪声特征。这个测试集并不是真正的测试集,而是已知标签的数据。

 
 

640?wx_fmt=png

Featexp计算了两个度量并显示了出来,帮助确认噪声:

  1. 趋势相关性(在测试图中):如果特征和目标在训练集和测试集上趋势不一样,有可能会导致过拟合。趋势相关性帮助我们理解训练集和测试集的相似度,bins的平均目标值用来计算这种相关性。上面的特征训练集和测试集有99%的 相关性,并不是噪声。

  2. 趋势改变:突然的和重复的趋势的方向的改变可能意味着噪声。但是当某个bin中的数量和其他的bin相差特别大的时候,也可能发生这种情况,这样的话,违约率就不能拿来和其他的bin做比较。

下面的特征就没有在训练和测试集上保持相同的趋势,趋势的相关系为85%。这两个度量可以用来丢弃噪声特征。

640?wx_fmt=png

丢弃低的趋势相关性的特征是很有用的,特别是在特征非常多而且彼此有相关性的时候。这样可以减少过拟合,而且其相关的特征也可以避免信息的损失。但是也不要丢弃掉太多的特征,因为容易降低performance。你不能使用特征的重要性来确定噪声特征,因为这些特征可能是非常重要的,但是确实是噪声。

使用不同时段的数据会表现的比较好,我们要确认一下是否这个特征在时间上有某些趋势。

get_trend_stats()函数返回一个dataframe,带有每个特征的趋势的相关性和改变情况。

640?wx_fmt=png

我们来使用低的趋势相关性来实际的丢弃几个特征,看看结果是不是有提升。

640?wx_fmt=png

我们可看到,丢弃特征的趋势相关性的阈值越高,Leaderboard上的AUC的分数越高。有趣的是,在测试集上的改变并不像在Leaderboard上一样。修改你的验证策略,让本地的测试AUC和LB的AUC保持一致,也是很重要的。完整的代码可见 featexp_demo notebook。

3. 特征工程

通过观察这些图,你可以创造更好的特征,对数据更好的理解可以帮助你进行更好的特征工程。但是,另外也可以帮助你提高已有的特征。我们看一下另外一个特征EXT_SOURCE_1:

640?wx_fmt=png

具有高的 EXT_SOURCE_1的值的用户具有低的违约率。但是,在第一个bin的时候,并不是这种趋势,在这个bin里面,只有一个负值,-99.985,而且量很大。这个就暗示了这个是个特殊的值,并不是跟随整体的趋势。幸运的是,非线性的模型在学习这种关系的时候不会有任何问题,但是,对于线性模型,如逻辑回归,这种特殊值和空值可以通过具有相似的违约率的bin来补全,而不是直接通过均值来补全。

4. 特征重要性

Featexp也帮助你测定特征的重要性。DAYS_BIRTH 和EXT_SOURCE_1 都有很好的趋势。但是,EXT_SOURCE_1 的群体集中在特定的bin中,表示特征对大部分的用户有着同样的信息,无法很好的区分他们。这个告诉我这个可能不如DAYS_BIRTH重要。基于XGBoost模型的特征重要性,DAYS_BIRTH 实际上比EXT_SOURCE_1更加重要。

5. 特征调试

查看Featexp的图可以通过做这样两件事情帮助你找到复杂的特征工程代码中的bug:

640?wx_fmt=png

  1. 查看是否特征的群体分布看起来正确。我遇到过就像上面的极端的例子,好几次都是很小的bug。

  2. 在绘图之前先假设特征的趋势的样子,如果不是你期待的样子,可能会是遇到问题了。坦白的说,这个假设的过程让创建机器学习模型更加的有趣。

6. 泄露检测和理解

目标的数据泄露或导致过拟合。泄露的特征有着高的特征重要性。但是理解这个特征为什么会泄露是非常重要的。查看featexp的图像可以帮助你理解。

下面的特征在‘Null’的bin上有0%的违约率,有100%的违约率在其他的bin上。很显然的,这是泄露的极端情况。这个特征只有当客户有违约的时候才有值。基于这个特征是什么,这个可能是由于出现了bug,或者说这个特征本来就是只有违约的人才有的(在这种情况下需要丢弃)。

640?wx_fmt=png

7. 模型的监测

既然featexp计算了两个数据集的相关趋势,就可以很容易的用来进行模型的监测。每次模型重新训练的时候,新的数据可以用来和测试好的训练数据来对比(特别是第一次创建模型的时候)。相关性的趋势可以帮助你监测有任何的特征和目标的关系是不是变了。


这样几个简单的事情可以帮助我创建一个更好的模型。利用featexp,花费15分钟绝对值得,之后你绝对不会对数据不知所措。

本文可以任意转载,转载时请注明作者及原文地址。


640?wx_fmt=jpeg

请长按或扫描二维码关注我们


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值