我正在处理一个数据集,该数据集具有针对单个示例具有多个类别的功能。 该功能如下所示:-
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个类别,导致稀疏且维数非常高的编码数据。
还有其他可以使用的编码吗?或任何可能的解决方案,此问题。谢谢。
答案 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
这是二进制编码器的基本原理。
答案 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)
问题