对具有高基数的名义类别进行编码

Encoding nominal categories with high cardinality

我正在预测数据集中存在的不同股票代码的单价。大约有 3000 种不同的股票代码已经用 1 - 3000 进行标签编码。

我有一个问题。字段 Stockcode 或 country 是分类特征,它们被编码为序列数值,就像简单的标签编码一样。但是,它们是名义特征,而不是有序特征。我们是否应该通过平均编码或频率编码等技术对这些特征进行编码,这有什么帮助吗?否则,这个标签编码标签将被机器解释为某种有序关系,不是吗?

对于基于树的模型,分类特征(标称)标签编码就足够了吗?

有些模型可以毫无问题地处理分类特征,例如决策树、随机森林等。

如果您使用其他模型,例如神经网络或 SVM,这将是一个问题。这些模型使用输入特征的欧氏表示

例如,在下图中,您有输入点的欧几里得表示法,它具有压力和年龄这两个特征。

如果你有像国家这样的分类特征,你可以有这样的数字编码:

{"England": 0, "France": 1, "Spain": 2, "Italy": 3}

您正在对您的分类值强制执行某种顺序。例如,在此编码中,法国位于英国和西班牙之间,这意味着西班牙在某种程度上比英国和法国“大”,而英国比法国和西班牙“小”。这在您的欧几里德 space.

中当然没有意义

这个问题的一个解决方案是进行单热编码,这意味着您正在为分类特征中的每个标签创建一个二元特征。

对于我们的示例,您可以进行以下编码:

Country_England  Country_France  Country_Spain  Country_Italy
0               0                0              1
0               1                0              0
1               0                0              0
0               0                1              0
0               1                0              0 

这会以某种方式使您的模型以更重要的方式处理您的分类特征。

不幸的是,这种方法有很多缺点。它使您的功能爆炸。 如果您的分类特征有 100 个唯一值,这意味着还有 100 个特征。 这会导致很多问题,增加模型的复杂性和不知名的 curse of dimensionality

在我看来,如果你有很多分类特征,最好的方法是使用能够处理此类输入的模型,如随机森林、决策树等。

或者如果你想在你的模型中使用这些特征,考虑使用一个热编码+特征选择,以降低space复杂度并提高性能

如果你想在 python 中使用一种热编码,有很多库。但我建议你 this one, from sklearn.