我们已经看到,将分类特征转换为数值表示是机器学习数据准备的常见步骤。然而,当分类特征具有大量唯一值,即高基数时,就会出现一个普遍问题。想象一下大型电商数据集中的邮政编码、用户ID或产品SKU等特征。这些特征可以轻松拥有数千甚至数百万个不同的类别。直接将标准编码技术应用于高基数特征通常会导致问题:独热编码:这种方法虽然对低基数特征有效,但变得不实用。如果一个特征有10,000个唯一类别,独热编码会创建10,000个新的二元特征。这种维度的大幅增加(“维度灾难”)显著增加了内存需求、训练的计算成本,并可能使模型更难泛化,潜在地导致过拟合。虽然稀疏矩阵表示可以在一定程度上管理内存方面,但计算负担和模型性能不佳的可能性仍然是重要问题。序数编码:基于顺序分配唯一整数通常不适用于高基数标称特征(即没有固有顺序的特征)。它会强制为类别设定一个人为的排名(例如,邮政编码90210是否“大于”邮政编码10001?),这可能误导许多类型的模型,特别是线性模型或基于距离的算法。那么,如何在不丢弃潜在有价值信息或不使模型过载的情况下有效处理这些特征呢?存在几种方法,通常需要在信息保留、维度和计算效率之间进行权衡。高基数特征的方法1. 分组稀有类别通常,高基数特征遵循幂律分布:少数类别非常常见,而许多其他类别出现频率较低。我们可借助此特点,将不常出现的类别归并为一个新的单一类别,通常标记为“其他”或“稀有”。工作原理:您首先确定一个频率阈值(例如,出现次数少于观察值1%的类别,或出现次数少于10次的类别)。所有低于此阈值的类别都将被新的占位符类别替换。其余更频繁的类别随后可以使用独热编码等标准方法进行编码,从而获得更易于管理数量的特征。权衡:这种方法显著降低了维度。然而,它会丢失稀有类别中包含的特定信息。阈值的选择很重要,可能需要进行一些尝试。如果稀有类别共同具有重要的预测信号,这种方法可能会损害模型性能。2. 目标编码(均值编码)如前所述,目标编码将每个类别替换为该类别目标变量的平均值。对于高基数特征,这很吸引人,因为它无论类别数量多少,都只创建一个新的数值特征。应用于高基数:它直接将可能数千个类别根据它们与目标的关联映射到一个特征列。这非常节省空间。重要风险:主要缺点是过拟合的高风险,特别是对于高基数特征。样本量少的类别可能会被编码为包含噪声的目标均值,这些均值不能代表真实的潜在关系。这可能导致模型“记住”训练数据,在未见过的数据上表现不佳。缓解:为了对抗过拟合,需要采用平滑(将类别均值与目标全局均值混合)、添加随机噪声或在编码期间使用交叉验证方案(在不同于当前编码折叠上计算均值)等技术。在使用目标编码时,尤其对于高基数特征,适当的正则化非常重要。它还需要仔细处理出现在测试集但未出现在训练集中的类别(通常用全局目标均值填充)。3. 哈希编码器(特征哈希)哈希编码器提供了一种将分类特征映射到固定大小向量的方法,无论其基数如何。工作原理:它将哈希函数(如MurmurHash3)应用于类别名称(或其字符串表示),将每个类别映射到预定义范围内的整数(输出维度数量,n_components)。这个整数决定了输出特征向量中“1”的索引(类似于独热编码,但列数是固定的,且通常小得多)。优点:直接控制输出维度。不需要存储类别到特征的映射,因此内存效率高,适用于流数据或在线学习。在预测时可以处理新类别(它们只会被哈希)。缺点:哈希冲突:主要缺点是不同类别可能哈希到相同的输出特征索引。这意味着生成的特征代表了可能不相关的原始类别的混合,导致信息丢失。冲突的可能性随着输出维度数量相对于原始基数的减少而增加。可解释性:生成的特征难以解释,因为它们不直接对应于特定的原始类别。选择n_components:选择输出维度数量涉及权衡:更少的维度节省内存和计算,但会增加冲突;更多的维度减少冲突,但会增加维度。4. 二进制编码二进制编码可以看作是独热编码和哈希编码之间的一种折衷。与独热编码相比,它降低了维度,同时避免了哈希的直接冲突(尽管信息仍然被压缩)。工作原理:类别首先被编码为整数(类似于序数编码,但这里顺序不重要)。这些整数被转换为它们的二进制表示(例如,5变为101)。二进制表示中的每个位置都成为一个单独的特征列。维度:创建的新特征数量为$log_2(N)$,其中$N$是唯一类别的数量。这显著少于独热编码在高$N$情况下创建的$N$个特征。例如,10,000个类别大约需要14个二进制特征($2^{14} = 16384$)。权衡:它比独热编码更节省内存,但可解释性较差。它比哈希编码保留了更多的独特性,但仍然以非线性方式将信息组合在二进制特征中。选择合适的方法选择最佳方法取决于几个因素:模型类型:基于树的模型(如随机森林、梯度提升)有时可以直接处理高基数特征,或者与线性模型或支持向量机相比,它们对独热编码导致的维度激增不那么敏感。它们也可能与目标编码(如果经过正则化)或哈希编码配合良好。性能与可解释性:哈希和复杂的目标编码方案有时能提供良好的性能,但使模型更难理解。分组稀有类别或使用二进制编码可能提供一种平衡。过拟合风险容忍度:目标编码需要仔细实现以避免过拟合。如果优先考虑简单性和鲁棒性,则可能更倾向于其他方法。计算资源:独热编码要求较高。哈希通常高效。目标编码的复杂性取决于所使用的正则化方法。稀有类别的存在:如果稀有类别数量众多但单独不重要,分组可能有效。如果它们带有特定的信号,可能需要更复杂的方法。处理高基数特征通常是一个迭代过程,涉及尝试。尝试多种编码方法并使用交叉验证评估它们对模型性能的影响,以找到最适合您的特定数据集和建模任务的方法是很常见的。请记住将所选编码方法一致地应用于您的训练和测试数据集,并且仅在训练数据上拟合编码器。