Kaggle机器学习比赛前top2%成绩的技巧

作者: 刘威威

编辑:龚 赛

前 言

参加kaggle比赛很有趣,可以帮助自己学习到很多有用的技术! 在过去的几年里,Abhay Pawar开发了一些标准方法来探索特征并构建更好的机器学习模型。 这些简单但功能强大的技术帮助他在Instacart Market Basket Analysis:https://www.kaggle.com/c/instacart-market-basket-analysis竞赛中获得了2%的排名,Abhay Pawar也将其用于实际问题处理中,本文对其方法进行一些总结,以觞读者。

01

特征可视化

在数字数据上构建任何监督学习模型的最重要方面之一是很好地理解这些特征。 查看模型的部分依赖图有助于了解模型的输出如何随任何特征而变化。

这些图的问题在于它们是使用训练有素的模型创建的。 如果我们可以直接从训练数据创建这些图,它可以帮助我们更好地理解基础数据。 事实上,它可以帮助我们完成以下所有事情:

1.理解特征

2.排除无用的特征

3.特征工程

4.特征重要性选择

5.特征调试

6.leakage检测和理解

7.模型监测

为了使其易于访问,我决定将这些技术放入python包featexp中,在本文中,我们将看到它如何用于特征探索。 我们将使用Kaggle的Home Credit Default Risk竞赛中的应用程序数据集。 竞赛的任务是使用给出的数据预测违约者。

02

特征理解

如果因变量(目标)是二进制,则散点图不起作用,因为所有点都位于0或1.对于连续目标,太多数据点使得难以理解目标与特征趋势。 Featexp可以创建更好的图形来帮助解决这个问题。 我们来试试吧!

Featexp创建数字特征的相等人口区(X轴)。 然后,它计算每个箱中目标的平均值,并在上面的左侧图中绘制它。 在我们的例子中,目标的均值只是违约率。 该图表告诉我们,DAYS_BIRTH(年龄较高)的负值较高的客户的违约率较低。 这是有道理的,因为年轻人通常更有可能违约。 这些图表有助于我们了解该特征告诉客户的内容以及它将如何影响模型。 右侧的图表显示了每个箱柜中的客户数量。

03

排除干扰特征

具有噪声的特征会导致过拟合,但是识别出它们并不容易。 在featexp中,你可以传递测试集并比较训练/测试中的特征趋势以识别有噪声的特征。 该测试集不是实际的测试集。 它是你知道目标的本地测试集/验证集。

Featexp计算在这些图上显示的两个指标,这有助于检测出有噪声的特征:

1.趋势相关性(见于测试图):如果某个特征不具有相同的趋势,比如跨越火车和评估集的目标,可能导致过度拟合。 发生这种情况是因为模型正在学习一些不适用于测试数据的东西。 趋势相关性有助于了解训练/测试趋势的类似程度,并使用训练和测试中的箱柜的平均目标值来计算它。 上述特征具有99%的相关性。 好像不是噪声特征!

2.趋势变化:趋势方向的突然和反复变化可能意味着噪音。 但是,这种趋势变化也可能发生,因为该区域在其他特征方面具有非常不同的人口,因此,其默认速率无法与其他区域进行真正比较。

下面的特征不具有相同的趋势,因此具有85%的低趋势相关性。 这两个指标可用于删除有噪声的特征。

当存在许多特征并且它们彼此相关时,丢弃低趋势相关特征的效果很好。 它可以减少过度拟合和其他相关特征,避免信息丢失。 同样重要的是不要删除太多重要特征,因为它可能会导致性能下降。 此外,你无法使用特征重要性识别这些噪声特征,因为它们可能非常重要且仍然非常嘈杂!

使用来自不同时间段的测试数据效果更好,因为这样就可以确定特征趋势是否随时间变化。

featexp中的get_trend_stats()函数返回一个具有趋势相关性的数据框,并针对每个特征进行更改。

让我们实际尝试在数据中删除具有低趋势相关性的特征,并查看结果如何改进。

我们可以看到,降低特征的趋势相关阈值越高,排行榜(LB)AUC越高。 不丢弃重要特征进一步将LB AUC提高至0.74。 它也很有趣,并且关于测试AUC不会像LB AUC那样变化。 确保您的验证策略正确,以便本地测试AUC遵循LB AUC也很重要。 整个代码可以在featexp_demo notebook中找到。

04

特征工程

通过查看这些图表获得的见解有助于创建更好的特征。 只需更好地了解数据就可以实现更好的特征工程。 但是,除此之外,它还可以帮助改进现有特征。 让我们看看另一个特征EXT_SOURCE_1:

具有较高EXT_SOURCE_1值的客户具有较低的默认费率。但是,第一个bin(约8%默认率)不遵循特征趋势(上升然后下降)。它只有-99.985左右的负值和大量人口。这可能意味着这些是特殊值,因此不遵循特征趋势。幸运的是,非线性模型在学习这种关系时不会有问题。但是,对于像逻辑回归这样的线性模型,这些特殊值和空值(将显示为单独的bin)应该用来自具有相似默认速率的bin的值来估算,而不是简单地用特征均值来估算。

05

特征重要性

Featexp还可以帮助您衡量特征的重要性。 DAYS_BIRTH和EXT_SOURCE_1都有一个很好的趋势。但是,EXT_SOURCE_1的人口集中在特殊值箱中,暗示该特征对大多数客户具有相同的信息,因此无法很好地区分它们。这说明它可能没有DAYS_BIRTH那么重要。基于XGBoost模型的特征重要性,DAYS_BIRTH实际上比EXT_SOURCE_1更重要。

06

特征调试

查看Featexp的图表可以帮助你通过执行以下两项操作来捕获复杂特征工程代码中的错误:

检查要素的人口分布是否正确。 由于小错误,我个人遇到过多次极端情况。

在查看这些图之前,总是假设特征趋势会是什么样子。 特征趋势看起来不是你预期的可能暗示某些问题。 坦率地说,这个假设趋势的过程使ML模型更有趣!

07

数据泄露检测

从目标到特征的数据泄漏导致过度拟合。 漏洞特征具有很高的特征重要性。 但是,理解为什么在特征中发生泄漏是困难的。 这时可以通过查看featexp图进一步确定。

以下特征在'Nulls'箱中的默认率为0%,在所有其他箱中为100%。 显然,这是泄漏的极端情况。 仅当客户违约时,此特征才有价值。 基于该特征的原因,这可能是因为一个错误或该特征实际上只为默认者填充(在这种情况下应该删除它)。 了解泄漏特征的问题可以进行更快的调试。

08

特征监测

由于featexp计算两个数据集之间的趋势相关性,因此可以很容易地用于模型监控。 每次重新训练模型时,都可以将新的训练数据与经过良好测试的训练数据进行比较(通常是在你第一次构建模型时训练数据)。 趋势关联可以帮助你监控特征是否有任何更改。 它与目标的关系等等。

本文编译自:https://towardsdatascience.com/my-secret-sauce-to-be-in-top-2-of-a-kaggle-competition-57cff0677d3c

END

机器学习算法工程师

一个用心的公众号

进群,学习,得帮助

你的关注,我们的热度,

我们一定给你学习最大的帮助

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181128B1JXSL00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券