折叠具有多个级别的分类变量的原则方法?

机器算法验证 回归 分类数据 特征工程 多类 常问问题
2022-01-14 22:09:57

为了将它们用作统计模型中的输入(预测器),有哪些技术可用于将许多类别折叠(或合并)为少数几个类别?


考虑一个变量,比如大学生专业(本科生选择的学科)。它是无序的和分类的,但它可能具有数十个不同的级别。假设我想在回归模型中使用专业作为预测变量。

将这些级别按原样用于建模会导致各种问题,因为实在太多了。使用它们会丢弃大量统计精度,并且结果难以解释。我们很少对特定专业感兴趣——我们更有可能对专业的广泛类别(子组)感兴趣。但并不总是很清楚如何将级别划分为这样的更高级别的类别,甚至不知道要使用多少更高级别的类别。

对于典型数据,我很乐意使用因子分析、矩阵分解或离散潜在建模技术。但是专业是相互排斥的类别,所以我不愿意利用它们的协方差来做任何事情。

此外,我不关心主要类别。我关心生成与我的回归结果一致的更高级别的类别。在二元结果的情况下,这对我来说暗示了类似线性判别分析 (LDA) 的方法来生成更高级别的类别,从而最大限度地提高判别性能。但是 LDA 是一种有限的技术,对我来说这感觉就像是在挖掘脏数据。此外,任何连续的解决方案都将难以解释。

同时,基于协方差的东西,如多重对应分析 (MCA),在这种情况下对我来说似乎是可疑的,因为相互排斥的虚拟变量之间存在固有的依赖性——它们更适合研究多个分类变量,而不是多个类别的同一个变量。

编辑:要清楚,这是关于折叠类别(而不是选择它们),并且类别是预测变量或自变量。事后看来,这个问题似乎是“把它们全部规范化,让上帝把它们整理出来”的合适时机。很高兴看到这么多人对这个问题感兴趣!

4个回答

如果我理解正确,您可以想象一个线性模型,其中一个预测变量是分类的(例如大学专业);并且您期望对于其级别的某些子组(类别的子组),系数可能完全相同。因此,数学和物理的回归系数可能相同,但与化学和生物学的回归系数不同。

在最简单的情况下,您将拥有一个具有单个分类预测变量的“单向方差分析”线性模型:

yij=μ+αi+ϵij,
在哪里i对分类变量(类别)的级别进行编码。但是您可能更喜欢将某些级别(类别)折叠在一起的解决方案,例如
{α1=α2,α3=α4=α5.

这表明可以尝试使用正则化惩罚来惩罚具有不同 alpha 的解决方案。立即想到的一个惩罚术语是

L=ωi<j|αiαj|.
这类似于套索,应该强制αiαj差异,这正是您想要的:您希望其中许多为零。正则化参数ω应选择交叉验证。


我从来没有处理过这样的模型,上面是我想到的第一件事。然后我决定看看是否有类似的实施。我做了一些谷歌搜索,很快意识到这叫做类别融合搜索lasso fusion categorical将为您提供大量参考资料供您阅读。以下是我简要介绍的一些内容:

Gertheiss 和 Tutz 2010 年发表在 Annals of Applied Statistics 上,看起来像是最近的一篇非常易读的论文,其中包含其他参考文献。这是它的摘要:

回归分析中的收缩方法通常是为度量预测器设计的。然而,在本文中,提出了类别预测变量的收缩方法。作为一个应用程序,我们考虑来自慕尼黑租金标准的数据,例如,市区被视为分类预测变量。如果自变量是分类变量,则需要对通常的收缩程序进行一些修改。L1- 提出并研究了基于惩罚的因子选择和类别聚类方法。第一种方法是为名义尺度水平设计的,第二种方法是为序数预测变量设计的。除了将它们应用于慕尼黑租金标准外,还对模拟研究中的方法进行了说明和比较。

我喜欢他们的类似 Lasso 的解决方案路径,它显示了当正则化强度增加时两个分类变量的级别如何合并在一起:

格泰斯和图茨 2010

我在一个我一直在做的项目中为此苦苦挣扎,在这一点上,我决定确实没有融合类别的好方法,所以我正在尝试一个分层/混合效果模型,我的相当于你的专业是随机效应。

此外,在这种情况下,实际上似乎需要做出两个融合决定:1)如何在适合模型时融合您拥有的类别,以及 2)在默认情况下,您将包含任何新的类别成为“其他”类别在您适合您的模型后有人梦想的专业。(随机效应可以自动处理第二种情况。)

当融合涉及任何判断时(与完全自动化的程序相反),我对“其他”类别持怀疑态度,它通常是类别中几乎没有什么东西的抓包,而不是任何有原则的分组。

随机效应处理许多级别,动态汇集(“从中汲取力量”)不同级别,可以预测以前看不见的级别等。一个缺点可能是级别的分布几乎总是被假定为正常的。

如果您有一个辅助自变量可以逻辑地用作分类预测变量的锚点,请考虑使用 Fisher 的最佳评分算法,这与他的线性判别分析有关。假设您想将大学专业映射到一个单一的连续指标中,并假设合适的锚点是入学前的 SAT 定量考试成绩。计算每个专业的平均定量分数,并用该平均值替换专业。您可以轻松地将其扩展到多个锚点,从而创建多个自由度来总结专业。

请注意,与早期的一些建议不同,最佳评分代表一种无监督学习方法,因此自由度(根据 Y 估计的参数数量)很少且定义明确,导致适当的统计推断(如果频繁,准确的标准误差,置信度(兼容性)区间和 p 值)。

我非常喜欢https://stats.stackexchange.com/users/28666/amoeba @amoeba 的惩罚建议。

处理这种情况的一种方法是将分类变量重新编码为连续变量,使用所谓的“目标编码”(又称“影响编码”)[1]。Z是具有分类级别的输入变量z1,...,zK, 然后让Y是输出/目标/响应变量。代替ZImpact(Z), 在哪里

Impact(zk)=E(Y | Z=zk)E(Y)

对于连续值Y. 对于二进制值Y, 采用logitE而不仅仅是E.

category_encoders库 [2]中有一个 Python 实现。

R 包Vtreat [3][4]中实现了一种称为“影响编码”的变体。这些作者在 2016 年的一篇文章[5] 和几篇博客文章 [6]中描述了该包(以及影响编码本身) 。请注意,当前的 R 实现不处理多项式(具有超过 2 个类别的分类)或多变量(向量值)响应。

  1. 丹尼尔·米奇-巴雷卡 (2001)。分类和预测问题中高基数分类属性的预处理方案。ACM SIGKDD 探索通讯,第 3 卷,第 1 期,2001 年 7 月,第 27-32 页。https://doi.org/10.1145/507533.507538
  2. 类别编码器。http://contrib.scikit-learn.org/categorical-encoding/index.html
  3. 约翰·芒特和妮娜·祖梅尔 (2017)。vtreat:统计上合理的“data.frame”处理器/调节器。R 包版本 0.5.32。 https://CRAN.R-project.org/package=vtreat
  4. 赢矢量(2017)。v 对待。GitHub 存储库位于https://github.com/WinVector/vtreat
  5. Zumel, Nina 和 Mount, John (2016)。vtreat:用于预测建模的 data.frame 处理器。1611.09477v3,ArXiv 电子版可在https://arxiv.org/abs/1611.09477v3获得。
  6. http://www.win-vector.com/blog/tag/vtreat/