每个示例对具有多个类别的分类特征进行编码

时间:2019-09-02 06:25:01

标签: machine-learning scikit-learn feature-extraction categorical-data

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

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

问题类似于发布的以下问题:-Encode categorical features with multiple categories per example - sklearn

现在,我要向量化此功能。一种解决方案是按照上述类似问题的答案中的建议使用MultiLabelBinarizer。但是,大约有2000个类别,导致稀疏且维数非常高的编码数据。

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

3 个答案:

答案 0 :(得分:0)

在许多情况下,当我遇到从具有多个类别的列中生成太多功能的问题时,我选择了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年时为一热点) !

答案 1 :(得分:0)

鉴于一个非常稀疏的数组,可以使用降维技术(例如PCA(主成分分析))将特征空间缩小到最能描述方差的前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个组件用作较小的维特征空间,从而可以解释原始特征空间的大部分方差。

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

model.explained_variance_

答案 2 :(得分:0)

我也遇到了同样的问题,但是我通过使用Countvectorizer(即sklearn.feature_extraction.text

)来解决binary=True中的CounterVectorizer(binary=True)问题