每个示例使用多个类别对分类特征进行编码

Encode a categorical feature with multiple categories per example

我正在处理一个数据集,该数据集具有一个示例具有多个类别的特征。 该功能如下所示:-

                              Feature
0   [Category1, Category2, Category2, Category4, Category5]
1                     [Category11, Category20, Category133]
2                                    [Category2, Category9]
3                [Category1000, Category1200, Category2000]
4                                              [Category12]

问题类似于发布的这个问题:-

现在,我想矢量化这个特征。一种解决方案是按照上述类似问题的答案中的建议使用 MultiLabelBinarizer 。但是,大约有 2000 个类别,这导致了稀疏和非常高维度的编码数据。

还有其他编码可以使用吗?或者这个问题的任何可能的解决方案。谢谢

在很多情况下,当我遇到从具有多个类别的列生成太多特征的问题时,我选择了 binary encoding,并且大多数时候效果很好,因此值得一试你也许。

假设你有 9 个特征,你将它们标记为 1 到 9,然后对它们进行二进制编码,你将得到:

cat 1 - 0 0 0 1
cat 2 - 0 0 1 0
cat 3 - 0 0 1 1
cat 4 - 0 1 0 0 
cat 5 - 0 1 0 1
cat 6 - 0 1 1 0
cat 7 - 0 1 1 1
cat 8 - 1 0 0 0
cat 9 - 1 0 0 1

这是二进制编码器背后的基本直觉。


PS: 假设 2 的 11 次方是 2048,并且您可能有 2000 个左右的类别,您可以将类别减少到 11 个特征列而不是很多(例如,1999 in one-hot的情况)!

给定一个非常稀疏的数组,可以使用诸如 PCA(主成分分析)之类的降维技术将特征 space 减少到最能描述方差的前 k 个特征。

假设 MultiLabelBinarizered 2000 特征 = X

from sklearn.decomposition import PCA
k = 5
model = PCA(n_components = k, random_state = 666)
model.fit(X)
Components = model.predict(X)

然后您可以将前 K 个分量用作较小维度的特征 space,它可以解释原始特征的大部分方差 space。

如果您想了解新的较小特征 space 描述方差的程度,您可以使用以下命令

model.explained_variance_

我也遇到了同样的问题,但我使用 sklearn.feature_extraction.text 中的 Countvectorizer 解决了 binary=True,即 CounterVectorizer(binary=True)