原文:
www.kdnuggets.com/2018/11/secret-sauce-top-kaggle-competition.html
由 Abhay Pawar, Instacart。
参加 Kaggle 比赛很有趣且上瘾!在过去的几年里,我开发了一些标准方法来探索特征并构建更好的机器学习模型。这些简单但强大的技术帮助我在 Instacart 市场篮子分析 比赛中获得了前 2% 的排名,我在 Kaggle 之外也使用这些技术。让我们直接进入正题!
1. Google 网络安全证书 - 快速进入网络安全职业生涯。
2. Google 数据分析专业证书 - 提升你的数据分析技能
3. Google IT 支持专业证书 - 支持你的组织的 IT
在数值数据上构建任何监督学习模型的最重要方面之一是充分理解特征。查看模型的部分依赖图有助于你了解模型输出如何随特征变化。
但这些图的问题在于它们是使用训练模型创建的。如果我们能够直接从训练数据创建这些图,它将有助于我们更好地理解基础数据。实际上,它可以帮助你完成以下所有任务:
-
特征理解
-
识别噪声特征 (最有趣的部分!)
-
特征工程
-
特征重要性
-
特征调试
-
泄漏检测和理解
-
模型监控
为了使其易于访问,我决定将这些技术放入 Python 包 featexp,在本文中,我们将看看如何使用它进行特征探索。我们将使用 Kaggle 上的 Home Credit Default Risk 竞赛的应用数据集。该竞赛的任务是使用提供的数据预测违约者。
- 特征理解
特征与目标的散点图无帮助
如果因变量(目标)是二值的,散点图就不起作用,因为所有点要么在 0,要么在 1。对于连续目标,数据点过多会使理解目标与特征的趋势变得困难。Featexp 创建了更好的图表来帮助解决这个问题。我们来试试吧!
DAYS_BIRTH(年龄)的特征与目标图
Featexp 创建了一个数值特征的等人口区间(X 轴)。然后计算每个区间的目标均值,并将其绘制在上面的左侧图中。在我们的例子中,目标均值就是违约率。图表告诉我们,高负值的 DAYS_BIRTH(较大年龄)的客户违约率较低。这是合理的,因为年轻人通常更容易违约。这些图表帮助我们了解特征对客户的影响以及它如何影响模型。右侧的图表显示了每个区间的客户数量。
- 识别噪声特征
噪声特征会导致过拟合,识别这些特征并不容易。在 featexp 中,你可以传递一个测试集,并比较训练集/测试集中的特征趋势以识别噪声特征。这个测试集不是实际的测试集,而是你的本地测试集/验证集,你对其目标是知道的。
训练集和测试集中的特征趋势比较
Featexp 计算两个指标以显示在这些图表上,这有助于评估噪声。
-
趋势相关性(在测试图中看到):如果一个特征在训练集和评估集中的趋势不同,则可能导致过拟合。这是因为模型正在学习一些在测试数据中不适用的内容。趋势相关性有助于理解训练/测试趋势的相似程度,计算时使用训练集和测试集中区间的目标均值。上述特征的相关性为 99%。看起来不噪声!
-
趋势变化:趋势方向的突然和重复变化可能暗示噪声。但这种趋势变化也可能发生,因为该区间在其他特征方面有很大不同,因此其默认率无法与其他区间进行比较。
下述特征没有保持相同的趋势,因此其趋势相关性较低,为 85%。这两个指标可以用来去掉噪声特征。
噪声特征示例
在特征数量较多且它们彼此相关时,去掉低趋势相关性的特征效果很好。这样可以减少过拟合,其他相关特征可以避免信息丢失。同时,也要注意不要去掉过多重要特征,否则可能会导致性能下降。此外,你不能仅通过特征重要性来识别这些噪声特征,因为它们可能非常重要,但仍然非常嘈杂!
使用不同时间段的测试数据效果更好,因为这样你可以确保特征趋势随时间保持一致。
***get_trend_stats()***函数在 featexp 中返回一个包含每个特征趋势相关性和变化的数据框。
get_trend_stats()返回的数据框
让我们实际尝试在数据中丢弃趋势相关性低的特征,看看结果是否有所改善。
不同特征选择下的 AUC 与趋势相关性
我们可以看到,丢弃特征的趋势相关性阈值越高,排行榜(LB)AUC 越高。 不丢弃重要特征可以进一步提高 LB AUC 到 0.74。值得注意且令人担忧的是测试 AUC 没有像 LB AUC 那样变化。确保验证策略正确,使得本地测试 AUC 跟随 LB AUC 也很重要。完整代码可以在featexp_demo笔记本中找到。
- 特征工程
通过查看这些图,你可以获得创建更好特征的洞见。对数据有更好的理解可以导致更好的特征工程。但除此之外,它还可以帮助你改进现有特征。让我们再看一个特征 EXT_SOURCE_1:
EXT_SOURCE_1 的特征与目标关系图
具有高 EXT_SOURCE_1 值的客户违约率较低。但,第一个区间(~8%的违约率)并没有跟随特征趋势(先上升再下降)。这个区间只有-99.985 左右的负值和一个大的人口基数。这可能意味着这些是特殊值,因此不符合特征趋势。幸运的是,非线性模型在学习这种关系时不会有问题。但是,对于像逻辑回归这样的线性模型,这些特殊值和空值(将作为单独的区间显示)应该用具有类似违约率的区间的值进行填补,而不是简单地用特征均值填补。
- 特征重要性
Featexp 还可以帮助你评估特征的重要性。DAYS_BIRTH 和 EXT_SOURCE_1 都有较好的趋势。然而,EXT_SOURCE_1 的人口集中在特殊值区间,意味着该特征对大多数客户的信息相同,因此不能很好地区分他们。这表明它可能没有 DAYS_BIRTH 重要。根据 XGBoost 模型的特征重要性,DAYS_BIRTH 实际上比 EXT_SOURCE_1 更重要。
- 特征调试
查看 Featexp 的图可以帮助你通过以下两种方式捕捉复杂特征工程代码中的错误:
零变异特征只显示一个区间
-
检查特征的总体分布是否正常。我个人因为一些小错误多次遇到类似上图的极端情况。
-
在查看这些图表之前,始终假设特征趋势会是什么样的。特征趋势看起来与预期不符可能暗示某些问题。坦率地说,假设趋势的过程使得构建机器学习模型变得更加有趣!
-
泄漏检测
目标到特征的数据泄漏会导致过拟合。泄漏特征具有较高的特征重要性。然而,理解特征泄漏的原因是困难的。查看 featexp 图表可以帮助你解决这个问题。
下面的特征在‘空值’分箱中的违约率为 0%,在所有其他分箱中的违约率为 100%。显然,这是泄漏的极端案例。该特征仅在客户违约时有值。根据特征的性质,这可能是由于错误,或者该特征仅为违约者填充(在这种情况下应删除)。了解泄漏特征的问题有助于更快地进行调试。
理解特征为何会泄漏
- 模型监控
由于 featexp 计算了两个数据集之间的趋势相关性,因此可以轻松用于模型监控。每次模型重新训练时,可以将新的训练数据与经过充分测试的训练数据进行比较(通常是第一次构建模型时的训练数据)。趋势相关性可以帮助你监控特征与目标之间的关系是否发生了变化。
这些简单的操作一直帮助我在实际生活中和在 Kaggle 上构建更好的模型。使用 featexp 只需 15 分钟就能查看这些图表,这绝对值得,因为你在此之后不会盲目操作。
个人简介: Abhay Pawar 目前在 Instacart 担任高级机器学习工程师,隶属于搜索与发现团队。他处理大规模机器学习问题,帮助 Instacart 提升服务质量。
原文。经许可转载。
资源:
相关内容: