探索目标编码中的层次混合

原文:towardsdatascience.com/exploring-hierarchical-blending-in-target-encoding-fea4c59b305b

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/2341c03351b826ab6db0cca95b7e30d8.png

图片由 Jessica AlvesUnsplash 上提供

你住在哪个社区?你被开了什么药?你为什么取消流媒体订阅?如今,这些都有一套代码,由你与之互动的任何政府机构、企业等存储在数据库中。如果你从事数据工作,你可能遇到过许多这样的代码。当它们可以取许多可能的值时,这样的代码被称为“高基数分类特征”。

一些高基数分类特征具有层次结构。图 1 描述了这样的结构,即北美行业分类系统(NAICS),该系统由美国政府用于对商业进行分类 [1]。

<…/Images/51627e534204ddfe44338f9fa8e89b21.png>

图 1: 北美行业分类系统(NAICS)代码的层次结构图 [1],按活动领域对商业进行分类。有许多具体的代码(位于“金字塔”底部),它们被分组到更一般的类别(上层)。例如,面包店。图片由作者提供。

许多代码集可以表示为层次结构。例如,美国地理区域可以分为许多具有许多代码值的小区域(邮政编码),或者非常大的区域(美国人口普查区域,例如“西部”)。或者,美国医学协会定义了约 475 个提供者专业领域,这些领域被汇总为分类、分组和部分。

尽管高基数分类特征(无论是否分层)具有太多的自由度,不能直接纳入机器学习模型,但编码或嵌入方法可以利用这些特征中的信息。目标编码(也称为“均值编码”或“影响编码”)是树形模型中的一种流行选择。神经网络通常使用实体嵌入,将代码映射到低维向量。然而,这些技术并没有结合层次代码结构的信息。

在机器学习中,对于分层分类有一些令人兴奋的研究方法,例如将高级分组处理方式与混合模型中的随机效应类似[2]。但这些方法尚未得到广泛应用。

一篇名为Towards Data Science的文章建议了一个针对基于树的模型的简单选项,由 Daniele Micci-Barreca 撰写,该选项涉及将高基数分类中的通用组信息混合到目标编码中[3]。

分层混合对于未见低频的代码是相关的,这在某些情况下可能很重要。例如,可能是一家公司正在开拓新市场,或者一种现有的药物正在被用于治疗不同的疾病。

分层混合对于未见或低频代码是相关的

分层混合试图通过使用更一般组的信息来提高未见或低频代码的目标均值估计。例如,如果我们没有比萨饼店的数据,那么“有限服务餐饮场所”的平均行为可能是一个起点。

这听起来很有道理,于是我开始测试这种 NAICS 代码的混合策略在公共数据集中的效果。

令人高兴的是,使用完整的 NAICS 层次结构提高了该数据集中未见代码的模型性能。然而,当仅使用层次结构的通用级别时,结果不太理想。某些代码结构可能适得其反。

在本博客文章中,我比较了标准目标编码和实体嵌入与各种混合目标编码的结果。我还尝试使用图神经网络技术构建了一些组合组。

我发现分层混合可能导致某些分组过度拟合。似乎存在一个偏差-方差权衡,模型可能会系统地放大对目标均值的错误估计。此外,过于宽泛的分组可能效果不佳。鉴于这些结果,可能建议测试代码结构以确保它能够与分层混合一起工作

在以下各节中,我尝试在公共小企业贷款数据集中对 NAICS 进行分层混合。结果与其他处理分层分类特征的方法进行了比较。我通过尝试不同的 NAICS“金字塔”级别以及使用图神经网络技术从数据中派生的替代分组,来探索分层混合的潜在局限性。

数据集和方法

本博客文章专注于美国小企业管理局(SBA)贷款中的北美行业分类系统(NAICS)行业代码[1] dataset [4–5]。模型预测小企业贷款违约Code可以在 GitHub 上找到[6]。

Kaggle 的 SBA 贷款数据集模型通常表现出强大的性能,准确率和 AUC 分数在 90% 以上。一个非常重要的特征是贷款期限 [7, 8];我认为期限可能反映了企业的信用价值,基于未公开的信息。SBA 显然在评估风险方面做得相当不错,因为这个特征是一个强大的预测因子。然而,我对 NAICS 感兴趣;因此,我排除了贷款期限,模型性能变得更为适度。利用其他人 [7-9] 做的数据探索,我选择了 8 个预测因子,包括 NAICS、员工人数、贷款创造的就业岗位、贷款金额和特许经营权状态。

SBA 贷款包含 1987-2014 年间的活动贷款。我使用 1990 年后批准的贷款,并删除了缺失 NAICS 的行,因此我的数据集有 688,081 行和 1,311 个独特的 6 位 NAICS 代码(可能来自几个 NAICS 版本)。由于目标编码混合关注的是低频未见的类别,我留出 NAICS 的随机 10% 样本;保留集是 131 个代码和 93,454 行。对于剩余的行,我进行 70/15/15 的训练/验证/测试拆分。结果将展示测试拆分和保留数据集,这些数据在训练或超参数调整中未使用。

XGBoost 模型构建

基线模型

让我们从使用 XGBoost,一种提升树模型,来测量没有 NAICS 信息的性能开始。大约 20% 的贷款违约,因此比率略有失衡。如果这是一个实际应用,检测违约可能是一个优先事项,所以我将展示精确率-召回率 AUC(PR-AUC)分数;ROC AUC 趋势相似。

除了没有 NAICS 的模型外,我还研究了独热编码。NAICS “金字塔”的顶部是 20 个部门(图 1)。我使用 Scikit-Learn 的 [10] OneHotEncoder,包括至少 5% 的行级别;20 个部门值中有 9 个被编码。其余的合并到一个“其他”组中。

表 1 显示了没有 NAICS 的基线和独热编码模型的性能。独热部门编码为标准测试集提供了一小点性能提升。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/59635b76c596c511f65679a80169daa1.png

表 1. 基线 XGBoost 模型在贷款违约方面的模型性能(PR-AUC 分数)。与训练中未见过的 NAICS 集合(“保留 NAICS”)的分数与测试数据集的分数进行比较。图片由作者提供。

我在这个博客中使用表格图片以提高可读性;原始数据可在存储库 [6] 中找到

XGBoost 模型

目标编码是处理高基数分类的常见策略。目标编码本质上用其均值响应替换分类层级,但为了防止低频或未见代码的过拟合,整体均值被“混合”到类别均值中。对于不频繁的代码,混合程度较高,而频繁的代码受影响较小。

有许多包使目标编码变得简单;然而,为了更好的比较,我创建了自己的编码器,它使用一个以 25 笔贷款为中点,宽度为 20 的 S 型混合函数;这个相同的混合函数也将用于分层混合。

下表 2 中第一行的青色行显示了使用这种标准目标编码的模型性能。对于通常随机选择的测试集,与基线相比有大幅性能提升!当然, 未见代码不会获得这种收益 因为它们只是被分配了整体平均违约率(灰色阴影单元格)。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/ad19c175df1be19254b3beddbb8fa6f6.png

**表 2:目标编码和分层混合模型的结果(青色)。前两行(灰色)与表 1 相同。目标编码的标准方法(混合整体均值)标记为“目标编码 NAICS”。分层混合测试显示在剩余的行中。

Micci-Barreca [3] 建议在目标编码中结合分层分类信息。低频或未见代码不会与整体均值响应混合,而是会向代码层级中下一级的均值收缩,如果有的话。根据人口加权,这种混合会在金字塔的下一级重复进行,必要时进行。

当我使用完整的 NAICS 层级时,我注意到保留的 NAICS(表 2 中的第 4 行)的性能有所提高!

如果我在金字塔的不同层级开始混合呢?表 2 中剩余的行显示了如果我在金字塔更高层级开始使用分层混合会发生什么。在“子部门”之上,收益可能会减少。对于部门混合,保留集的性能低于基线。

但如果我在金字塔的不同层级开始混合呢?表 2 的最后两行显示了如果我从“子部门”开始使用分层混合会发生什么,我发现收益较少。对于部门混合,保留集的性能低于基线。

看起来,层级的细节很重要。不同的代码集会有不同的组织结构,不同的粒度。是否有可能存在分层混合根本不起作用的分类?

神经网络模型

除了 XGBoost 之外,我还尝试了神经网络模型中的层次化混合。结果与标准技术进行了比较(表 3):

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/47311a35c267ecc93f74a40dd4683cc4.png

表 3:包含和不包含 NAICS 信息的神经网络模型。图由作者提供。

没有 NAICS 的基线模型与 XGBoost(tanh 激活对于这些数据很有帮助)的性能相似。作为另一个基线,我尝试了实体嵌入,这是神经网络中高基数特征的标准方法(表 3 中的第 2 行)。实体嵌入是中间神经网络层的输出,将高基数特征映射到一个低维度的数值空间(我使用 8 个维度)。

实体嵌入在随机测试集上显示出巨大的性能提升,但对于未见过的代码来说却是灾难性的。我没有缺失的 NAICS 数据,未见过的代码被映射到一个模型忽略的值。因此,模型训练并没有针对这些值进行优化。当我随机将 10%的训练数据分配给被忽略的值时,保留集的性能更接近基线(表 3 中的第 3 行)。

如果不是使用实体嵌入,而是将目标编码的 NAICS 作为特征,我会看到与实体嵌入随机缺失值相似的结果。使用层次化目标编码可以以类似于 XGBoost 模型中看到的方式提高未见过的性能。

总结来说,针对目标编码的神经网络结果在定性上与 XGBoost 相似。**一个额外的观察是,实体嵌入对于未见过的代码可能会存在问题。**如果将模型泛化到未见过的代码很重要,我可能会避免使用实体嵌入;对我来说,随机缺失的解决方案感觉比目标编码更麻烦。

在下一节中,我将探讨一些嵌入方法,以了解特定的代码层次结构如何影响结果。我首先基于数据构建了一个替代层次结构。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/9b41dcf44ee80154694e21b6a196cdba.png

Alice DietrichUnsplash上的照片

深度图信息最大化嵌入

之前,我使用了标准 NAICS 层次结构的不同部分来寻找层次化目标编码的限制。在这里,我尝试了不同的分组,希望对这种方法的有效性有更多的了解。我将使用深度图信息最大化(DGI)从数据中的特征构建层次结构。

DGI 是一种无监督的图机器学习技术[11]。表示是从图中连接的节点中学习的,提取与正确结构相关的特征关系。

我使用 DGI 来获取一个低维度的信息摘要,以区分不同的 NAICS。我的图很简单;贷款节点连接到 NAICS 节点。我再次拟合了大小为 8 的嵌入。更多方法细节请参阅 GitHub 仓库 [6]。由于 DGI 基于预测因子,它可以生成未见代码的嵌入。(在这里,我只在训练和验证切片上训练 DGI,但根据用例使用整个数据集也不会出错。)图 2 展示了结果的 TSNE [12] 可视化。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/d9db4aeb1ee14459f41f10daca3153e9.png

图 2: 8 维 DGI 嵌入的 2D TSNE 可视化。每个点代表一个 NAICS,点根据目标编码的贷款违约率着色(右边的颜色条)。图片由作者提供。

NAICS 部门似乎与嵌入没有强烈的相关性;轮廓分数为 -0.14。然而,图 2 显示嵌入与贷款违约率有一些关系。

为了对代码进行分组,我使用了 k-means 聚类。最佳聚类发生在 k=3(轮廓分数 0.60)。图 3 展示了嵌入的 k-means 聚类结果。在更高的 k 值下,组可能并不一定很好地分离,但它们是相邻的,可以看作是分割。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/ceffa1a53ca0aa2ae96002e79f778427.png

图 3. 不同聚类数量 k 的 DGI 嵌入的 k-means 聚类 TSNE 可视化。颜色表示聚类。图片由作者提供。

为了与 NAICS 代码进行比较,我使用了 DGI 的类似粒度级别(基于我的数据集中的计数)。使用 k=834、353、106 和 20 的聚类计数来构建类似于行业、行业组、子部门和 NAICS 部门的组。表 4 展示了使用这个“金字塔”进行分层混合的结果。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/c56e03a1749f773567ecae26b9afb133.png

表 4. XGBoost 模型中嵌入和嵌入衍生信息的结果。标准目标编码和实体嵌入的参考性能在顶部(灰色,值如表 2 和 3 所示)。使用 DGI 嵌入聚类进行分层混合的是青色。图片由作者提供。

DGI 聚类表现非常差!大多数聚类都是适得其反的。

从上述内容中,我首先得出结论,层次混合并不总是有效。值得注意的是,DGI 分组与目标率相关,并且当 k=10 个聚类与单热编码中的 9+1 个未知的 NAICS 组相比时,DGI 组在保留代码方面比标准 NAICS 组表现更好(未显示,见 [6])。

什么使得 DGI 分组在层次编码中无效,尽管在其他方式使用时效果足够好?我发现编码值本身似乎泛化得不如 NAICS 代码。目标编码本身是贷款违约的一个(简单)模型;因此,其性能可以衡量(表 5)。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/91a2137292a9c6f4d9d892f71e708d02.png

表 5:仅作为贷款违约预测指标的嵌入性能。标准目标编码(第一行)与使用标准 NAICS 分组与 DGI 分组进行层次混合相比。

层次混合在均值响应模型方面优于“常规”目标编码,对于两个数据集和两种分组都如此。然而,尽管基于 DGI 的层次编码在随机测试数据上与基于 NAICS 的层次编码具有相似的结果,但在保留代码方面表现较差。

当将均值编码值与实际目标率进行比较时,标准目标编码和两种类型层次编码的 RMSE 相似。基于 DGI 的编码的实际值显示出向较低值发展的趋势(DGI 基于编码的平均值为 17.5%,而基于 NAICS 的编码为 19.6%)。

XGBoost 模型中编码的 SHAP 相关性图显示,标准目标编码和两种类型层次编码的响应曲线相似(图 4A)。PDP 结果也非常相似(未显示,见 [6])。响应曲线的相似性是有道理的,因为大多数代码在三种编码方案中都具有相似的价值。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/d01d79636d3383e55034ff1c620f6984.png

图 4. XGBoost 模型中编码值的 SHAP 响应,对于标准目标编码、标准 NAICS 层次编码和基于 DGI 的层次编码。A. 平滑的 SHAP 相关性,显示模型均值响应与编码特征值的比较。B. 编码类型均值编码值和均值 SHAP 值的比较。

然而,基于 DGI 编码的实际值较低,并且与 20.5%的训练平均违约率(图 4B)相差较远。因为模型对平均值的响应更强,DGI 嵌入中的误差被放大;模型响应过于强烈,出现了过拟合。

最后的想法

所有普遍性都是错误的,包括这一条——马克·吐温

分层混合只有在分类系统与问题相关,并且处于正确的细节级别时才有用

分层混合使数据准备复杂化,并且可能不会提高所有代码集的性能。但是,当层次结构适合且未见代码对您的目的很重要时,这项技术可能非常有价值。

即使罕见或新的代码至关重要,并非所有代码分组都将有用。当代码与目标响应无关、处于错误的粒度级别或偏置均值估计时,分层混合可能不起作用

在使用分层编码之前,测试保留代码的性能以评估代码集是否适合此方法可能是明智的。有时使用具有 one-hot 编码的一般组可能更安全。在其他幸运的情况下,例如在此数据集中标准 NAICS 代码的情况,分层混合可以提供良好的性能提升。

在我的日常工作日,我经常看到分层分类,我经常觉得这些没有被充分利用。因此,我对分层编码有潜力帮助一些模型感到兴奋!在未来的工作中,我希望检查实体和 DGI 嵌入中的信息,并可能探索更多的编码方法。

非常感谢 Daniele Micci-Barreca 发明这种方法,以及非常有益的建议!

参考文献

[1] 美国人口普查局,北美行业分类系统.

[2] B. Avanzi, G. Taylor, M. Wang 和 B. Wong, 在精算应用中使用高基数分类特征的机器学习 (2023), arXiv:2301.12710v1.

[3] D. Micci-Barreca, 扩展目标编码 (2020), Towards Data Science.

[4] M. Li, A. Mickel 和 S. Taylor, 这笔贷款应该批准还是拒绝?:一个带有类别分配指南的大型数据集 (2018), 统计学教育杂志 26 (1).

[5] M. Toktogaraev, 这笔贷款应该批准还是拒绝? (2020), Kaggle.

[6] V. Carey,GitHub 仓库,github.com/vla6/Blog_gnn_naics.

[7] R. Colindres, 贷款违约预测与贷款参数优化器 (2023), Kaggle.

[8] M. B. 贷款风险评估(准确率 94.5%) (2021), Kaggle.

[9] R. Aryo, SBA 贷款批准模型 (2023), Kaggle.

[10] F. Pedregosa 等人,Scikit-learn:Python 中的机器学习 (2011), JMLR 12, 2825–2830.

[11] P. Veličković 等人,深度图信息最大化 (2018) arXiv:1809.10341.

[12] L. van der Maaten 和 G. Hinton, 使用 t-SNE 可视化数据 (2008), 机器学习研究杂志 9: 2579–2605.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值