如果有超过 15 个唯一值,我如何对分类列进行编码?

数据挖掘 回归 分类数据 编码 一热编码 分类编码
2021-09-24 13:40:34

我正在尝试使用这些数据使用回归制作数据分析报告。由于回归只允许数字类型,因此我需要对分类数据进行编码。但是,其中大多数具有超过 15 个独特的值,例如国家/地区。

我仍然使用 one-hot 编码吗?还是有替代方案?在这个数据集上使用回归是个好主意吗?

4个回答

[编辑] 另见卡洛斯的回答,我认为它比我的好。

您应该对分类特征使用一种热编码。用数值替换分类值将是一个坏主意,因为它在值之间引入了顺序,并且模型会尝试根据此顺序查找模式(例如,'x < 4')。

如果确实有太多不同的值,那么删除或替换最不常见的值通常是一个好主意,但这些数据似乎不是问题。

根据记录,超过 15 种不同的值没什么好害怕的。例如,在处理文本数据时,通常会处理一个单词的数千个值。

虽然这里的大多数答案都建议使用各种编码方案,但我想提出一种不同的方法:折叠类别。这个想法是,如果有两个(或更多)相似的类别,您可以将它们合并为一个类别,从而降低特征/变量的维数。此外,如果有一些类别具有预期的低频,您可以将它们折叠为“其他”类别。

如果您有高基数分类数据(至少超过 10 个),您可以进行目标编码。高基数的一种热编码对以下情况不利:

  • 模型的输入数据变得非常广泛,既不能保证最优也不能保证有效的方法,

  • 创建的特征变得稀疏(大多数级别几乎没有出现在数据中)

  • 一种热编码不处理新的和看不见的类别

这里的一种选择是进行目标编码。

这是一个介绍

在这里找到一个 python 实现。

好处

目标编码的好处:

  • 处理高基数问题
  • 类别是有序的,便于提取信息和简化模型

缺点

  • 过拟合

对具有高基数的分类数据进行编码有很多不错的选择。如果使用 Python,Category Encoders 包在撰写本文时有十几个选项。我在这里写了使用其中一些的指南

类别编码器包括几个贝叶斯编码器,包括目标编码器。

二进制和散列编码器有助于降低维度,但可能会使您的模型更难获取数据中的信号。