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

问题描述 投票:0回答:4

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

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

问题与发布的问题类似:- 每个示例使用多个类别对分类特征进行编码 - sklearn

现在,我想向量化这个特征。一种解决方案是按照上述类似问题的答案中的建议使用

MultiLabelBinarizer
。但是,大约有 2000 个类别,这导致编码数据稀疏且维数非常高。

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

machine-learning scikit-learn feature-extraction categorical-data
4个回答
1
投票

给定一个极其稀疏的数组,我们可以使用 PCA(主成分分析)等降维技术将特征空间减少到最能描述方差的前 k 个特征。

假设 MultiLabelBinarized 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_

1
投票

在很多情况下,当我遇到从具有多个类别的列生成太多特征的问题时,我选择了二进制编码,并且大多数情况下效果都很好,因此也许值得您尝试一下。

想象你有 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 个特征列,而不是很多(例如,one-hot 的情况下为 1999)!


0
投票

我也遇到了这些相同的问题,但我通过使用

Countvectorizer
中的
sklearn.feature_extraction.text
解决了,只需给出
binary=True
,即
CounterVectorizer(binary=True)


0
投票

另一种方法是将每个数据点的类别集视为文档中的单词,并应用类似于 NLP 的 TF-IDF 技术。

此编码的优点是自动弱化不相关的类别以及将相关的同义类别关联在一起。

© www.soinside.com 2019 - 2024. All rights reserved.