本文为 AI 研习社编译的技术博客,原标题 :
My secret sauce to be in top 2% of a kaggle competition
作者 | Abhay Pawar
翻译 | 就2 校对 | 酱番梨
整理 | 志豪
原文链接:
https://towardsdatascience.com/my-secret-sauce-to-be-in-top-2-of-a-kaggle-competition-57cff0677d3c
参加kaggle竞赛确实是一件非常有趣而且令人上瘾的事情。
前几年,我找到了一些标准的流程来探索特征进而建立起更好的机器学习模型。这些简单但是强大的技术帮我在 Instacart 网站购物车分析竞赛中排进前2%,而且在其他地方,这这些方法也非常有用。所以,让我们开始吧!
在一堆数据上,最重要的是,你要很好的理解这些特征。通过查看模型的特征依赖图可以帮助你理解模型的输出--随着特征的变化。
但是,上面这些图存在的问题是:他们是采用训练过的模型创建的。
如果我们可以直接从训练数据上直接创建,那就可以帮助我们更好的理解基础数据。实际,它可以帮你完成下面的事情:
特征的理解
识别噪声特征(最有趣的部分!)
特征工程
重要特征选择
特征的调试
遗漏检测和理解
模型监控
为了便于于访问,我决定将这些技术放到python 包 featexp 中,在本文中,我们将了解如何将这些技术用于特征探索。我们将在Kaggle上使用来自 Home Credit Default Risk 房屋信用违约风险竞赛的应用程序数据集。竞赛的目标是利用提供给他们的数据来预测违约者。
1、特征的理解
特征与目标的散点图并没有帮助
如果因变量(目标)是二元的,散点图就不起作用,因为所有点都在0或1处。对于连续目标,太多的数据点使得很难理解目标和特征趋势。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)的特征与目标图
右侧 Featexp 创建了相同人数的柱状图 (x轴)。然后,它计算每个柱子中的目标均值,并将其绘制在上面左边的图中。在我们的例子中,Y坐标 target是平均的违约率。
这个图告诉我们,DAYS_BIRTH(较高年龄)的负值较高的客户违约率较低。这是有道理的,因为年轻人通常更容易违约。这些图帮助我们理解这个特征告诉了客户什么,以及它将如何影响模型。右边的图显示了每个柱子里顾客的数量。
2、识别噪声特征
噪声特征会导致过度拟合和识别它们并不容易。在featexp中,您可以通过测试集(或验证集),并比较训练/测试中的特征趋势,以识别噪声趋势。
get_univariate_plots(data=data_train, target_col='target', data_test=data_test, features_list=['DAYS_EMPLOYED'])
训练集与试验集特征趋势的比较
Featexp计算了在这些图上显示的两个指标,这些图有助于测量噪声:
趋势相关(见测试图): 如果一个特性在训练集和评估集上不具有相同的趋势w.r.t.目标,它会导致过度拟合。这是因为模型正在学习一些在测试数据中不适用的东西。趋势相关性有助于理解 训练集 / 训练集 趋势的相似性,并用于计算训练集和测试集的平均目标值。上述特征具有99%的相关性。似乎不是噪声!
趋势变化: 趋势方向的突然重复变化可能意味着噪声。但是,这种趋势变化也可能发生,因为该柱子表示的人群在其他特性方面具有非常不同的特征,因此,它默认的违约率无法和其他人群相比。
下面的特征不具有相同的趋势,因此具有低的趋势相关性85%。这两个指标可以用来去掉噪声特征。
噪声特征示例
当有很多特征并且它们彼此相关时,降低-低趋势相关特征效果很好。它可以减少过拟合和其他相关特性,避免信息丢失。不要删除太多重要的特性也很重要,因为这可能导致性能下降。另外,您不能使用特性重要性来识别这些有噪声的特性,因为它们可能相当重要,但仍然非常有噪声!
使用来自不同时间段的测试数据会更有效,因为这样您就可以确定特性趋势是否会随着时间的推移而保持不变。
featexp中的get_trend_stats()函数会返回一个具有趋势关联和每个特性变化的dataframe。
from featexp import get_trend_stats
stats = get_trend_stats(data=data_train, target_col='target', data_test=data_test)
get_trend_stats() 返回Dataframe
让我们尝试在数据中删除趋势相关性较低的特征,看看结果如何改进。
使用趋势相关不同特征选择下的AUC
我们可以看到,特征趋势相关阈值越高,特征下降,排行榜上(LB) AUC越高。不删除重要的特性进一步将 AUC提高到0.74。有趣的是,测试AUC的变化没有 排行 AUC大。完整的代码可以在 featexp_demo 笔记本中找到。
3.特征工程
通过查看这些图,有助于创建更好的特征。仅仅是对数据有更好的理解就可以产生更好的特征工程。但是,除此之外,它还可以帮助您改进现有的特征。让我们看看EXT_SOURCE_1的另一个特征:
特征 与 EXT_SOURCE_1的目标图
EXT_SOURCE_1的高价值客户的违约率很低。但是,第一个柱(大约8%的默认值)没有遵循特征趋势(先上升后下降)。它只有-99.985左右的负值,而且人口众多。这可能意味着这些值是特殊值,因此不遵循特征趋势。幸运的是,非线性模型学习这种关系不会有问题。但是,对于逻辑回归这样的线性模型,这些特殊的值和空值(将作为一个单独的 柱 显示)应该由一个具有相似违约率的 柱 赋值,而不是简单地用特征均值进行赋值。
4. 重要特征(特征选择)
Featexp还帮助您判断特征的重要性。DAYS_BIRTH和EXT_SOURCE_1都有很好的趋势。但是,EXT_SOURCE_1的种群集中在特殊的值柱子中,这说明它可能不如DAYS_BIRTH重要。基于XGBoost模型的特征重要性,DAYS_BIRTH实际上比EXT_SOURCE_1更重要。
5、特征调试
查看Featexp的图可以通过以下两种方式帮助您捕获复杂特征工程代码中的bug:
零变异特征只显示一个柱子
1、检查特征的总体分布是否正确。我个人曾多次遇到过类似于上述的极端情况,都是由于小的bug引起的。
2、在查看这些图之前,总是假设特征趋势是什么样子。特征趋势看起来不像您预期的那样,可能会提示一些问题。坦率地说,这种假设趋势的过程使得构建ML模型更加有趣!
6、遗漏特征检测
从目标到特征的数据遗漏将导致过拟合。 遗漏的特征一般具有很高的重要性。但是,理解为什么在一个特征中发生泄漏是困难的。查看特征图可以帮助您实现这一点。
下面的特征在' null ' 柱子中有0%的默认值,在所有其他的柱子中有100%的默认值。显然,这是遗漏的极端情况。这个特征只有在客户默认时才有值。那么这个特征是什么,这可能是由于一个bug,或者该特征实际上只是为默认用户填充的(在这种情况下,它应该被删除)。了解遗漏特征的问题将导致更快的调试。
理解为什么一个特征是应该要去掉的
7、模型的监控
由于featexp计算两个数据集之间的趋势相关性,因此它很容易用于模型监控。每次重新训练模型时,新的训练数据可以与经过良好测试的训练数据进行比较(通常是首次构建模型时的训练数据)。趋势相关可以帮助您监控特征w.r.t.是否有任何变化,它与目标的关系。
· · ·
做这些简单的事情总是帮助我在现实生活和kaggle比赛上建立更好的模型。使用featexp需要15分钟来查看这些说明文档,这绝对是值得的,因为在那之后你就不会找不到方向了。
对于探索特征,您还发现了什么其他有用的技巧和提示?我一直在寻找反馈。在评论中让我知道,或者通过abhayspawar@gmail.com联系我。感谢您的阅读!雷锋网雷锋网雷锋网
想要继续查看该篇文章相关链接和参考文献?
长按链接点击打开或点击【进入Kaggle竞赛前 2% 的秘诀】:
http://ai.yanxishe.com/page/TextTranslation/1201
AI研习社每日更新精彩内容,观看更多精彩内容:
等你来译: