我在kaggle竞赛中获得了2%的秘诀!
参加kaggle的竞赛是一件让人上瘾的事情!在过去的几年里,我开发了一些标准方法来探索功能并构建更好的机器学习模型。这些简单但功能强大的技术帮助我在Instacart Market Basket Analysis竞赛中获得了2%的排名,我也在kaggle以外的地方使用了它们。一起来看下吧!
在数字数据上构建任何监督学习模型的最重要方面之一是很好地理解这些特征。查看模型的部分依赖图有助于您了解模型的输出如何随任何特征而变化。
但是,这些图的问题在于它们是使用训练有素的模型创建的。如果我们可以直接从训练数据中创建这些图,它可以帮助我们更好地理解基础数据。事实上,它可以帮助您完成以下所有事情:
- 特征理解
- 识别噪声特征(最有趣的部分!)
- 特征工程
- 特征重要性
- 功能调试
- 泄漏检测和理解
- 模型监测
为了使其易于访问,我决定将这些技术放入python包featexp中,在本文中,我们将看到它如何用于特征探索。我们将使用Kaggle的Home Credit Default Risk竞赛中的应用程序数据集。竞赛的任务是利用提供给他们的数据预测违约者。
1.特征理解
功能与目标的散点图无济于事
如果因变量(目标)是二进制,则散点图不起作用,因为所有点都在0或1处。对于连续目标,太多的数据点使得难以理解目标与特征趋势。Featexp可以创建更好的图形来帮助解决这个问题。我们来试试吧!
DAYS_BIRTH(年龄)的特征与目标图
Featexp创建数字特征的相等人口区(X轴)。然后,它计算每个箱中目标的平均值,并在上面的左侧图中绘制它。在我们的例子中,目标的均值只是违约率。该图表告诉我们,DAYS_BIRTH(年龄较高)的负值较高的客户的违约率较低。这是有道理的,因为年轻人通常更有可能违约。这些图表有助于我们了解该功能告诉客户的内容以及它将如何影响模型。右侧的图表显示了每个箱柜中的客户数量。
2.识别嘈杂的功能
嘈杂的功能导致过度拟合并识别它们并不容易。在featexp中,您可以传递测试集(或验证集)并比较训练/测试中的特征趋势以识别噪声。
训练与试验特征趋势的比较
Featexp计算在这些图上显示的两个指标,这有助于衡量噪音:
- 趋势相关性(见于测试图):如果某个特征不具有相同的趋势目标,跨越训练和评估集的目标,可能导致过度拟合。发生这种情况是因为模型正在学习一些不适用于测试数据的东西。趋势相关性有助于了解训练/测试趋势的类似程度,并使用训练和测试中的箱柜的平均目标值来计算它。上述特征具有99%的相关性。
- 趋势变化:趋势方向的突然和反复变化可能意味着噪音。但是,这种趋势变化也可能发生,因为该区域在其他特征方面具有非常不同的种群,因此,其默认速率是无法与其他区域进行真正比较的。
下面的特征不具有相同的趋势,因此具有85%的低趋势相关性。这两个指标可用于删除嘈杂的功能。
嘈杂功能的示例
当存在许多特征并且它们彼此相关时,丢弃低趋势相关特征的效果很好。它可以减少过度拟合和其他相关功能,避免信息丢失。同样重要的是不要删除太多重要功能,因为它可能会导致性能下降。此外,您无法使用功能重要性识别这些噪声功能,因为它们可能非常重要且仍然非常嘈杂!
使用来自不同时间段的测试数据效果更好,因为这样您就可以确定特征趋势是否随时间变化。
featexp中的get_trend_stats()函数返回一个具有趋势相关性的数据框,并针对每个特征进行更改。
get_trend_stats()返回的数据帧
让我们实际尝试在数据中删除具有低趋势相关性的特征,并查看结果如何改进。
使用趋势相关的不同特征选择的AUC
我们可以看到,降低特征的趋势相关阈值越高,排行榜(LB)AUC越高。不丢弃重要特征进一步将LB AUC提高至0.74。同样有趣的是,测试AUC的变化不会与LB AUC一样多。整个代码可以在featexp_demo笔记本中找到。
3.特征工程
通过查看这些图表获得的见解有助于创建更好的功能。只需更好地了解数据就可以实现更好的功能工程。但是,除此之外,它还可以帮助您改进现有功能。让我们看看另一个功能EXT_SOURCE_1:
EXT_SOURCE_1的特征与目标图w.r.t.目标
具有较高EXT_SOURCE_1值的客户具有较低的默认费率。但是,第一个bin(约8%默认率)不遵循特征趋势(上升然后下降)。它只有-99.985左右的负值和大量人口。这可能意味着这些是特殊值,因此不遵循特征趋势。幸运的是,非线性模型在学习这种关系时不会有问题。但是,对于像逻辑回归这样的线性模型,这些特殊值和空值(将显示为单独的bin)应该用来自具有相似违约率的bin值来估算,而不是简单地用特征均值来进行估算。
4.特征重要性
Featexp还可以帮助您衡量功能的重要性。DAYS_BIRTH和EXT_SOURCE_1都有一个很好的趋势。但是,EXT_SOURCE_1的填充集中在特殊值bin中,它表示它可能不如DAYS_BIRTH那么重要。基于XGBoost模型的特征重要性,DAYS_BIRTH实际上比EXT_SOURCE_1更重要。
5.功能调试
查看Featexp的图表可以帮助您通过执行以下两项操作来捕获复杂功能工程代码中的错误:
零变异特征仅显示单个bin
- 检查特性的总体分布是否正确。由于小错误,我个人遇到过多次极端情况。
- 在查看这些图之前,总是假设特征趋势会是什么样子。特征趋势看起来不像您预期的可能暗示某些问题。坦率地说,这个假设趋势的过程使ML模型更有趣!
6.泄漏检测
从目标到特征的数据泄漏导致过度拟合。漏洞功能具有很高的特征重要性。但是,理解为什么在特征中发生泄漏是困难的。
以下功能在'Nulls'箱中的默认率为0%,在所有其他bin中为100%。显然,这是泄漏的极端情况。这个特性只有在客户默认时才有值,根据特性是什么,这可能是因为一个bug或该特性实际上只为默认用户填充(在这种情况下应该删除它)。了解泄漏功能的问题将导致更快的调试。
了解功能泄漏的原因
7.模型监测
由于featexp计算两个数据集之间的趋势相关性,因此可以很容易地用于模型监控。每次重新训练模型时,都可以将新的训练数据与经过良好测试的训练数据进行比较(通常是在您第一次构建模型时训练数据)。趋势关联可以帮助您监控w.r.t功能中是否有任何更改。它与目标的关系。
做这些简单的事情总能帮助我在现实生活和讨人喜欢中建立更好的模型。使用featexp需要15分钟来查看这些情节,这绝对是值得的,因为在那之后你就不会盲目飞行了。