Je travaille sur un ensemble de données qui a une fonctionnalité qui a plusieurs catégories pour un seul exemple. La fonctionnalité ressemble à ceci: -
Feature 0 [Category1, Category2, Category2, Category4, Category5] 1 [Category11, Category20, Category133] 2 [Category2, Category9] 3 [Category1000, Category1200, Category2000] 4 [Category12]
Le problème est similaire à la question posée: - Encodez des caractéristiques catégorielles avec plusieurs catégories par exemple - sklearn
Maintenant, je veux vectoriser cette fonctionnalité. Une solution consiste à utiliser MultiLabelBinarizer
comme suggéré dans la réponse à la question similaire ci-dessus. Mais, il y a environ 2000 catégories, ce qui donne des données codées clairsemées et très dimensionnelles.
Y a-t-il un autre codage qui peut être utilisé? Ou toute solution possible à ce problème. Merci.
3 Réponses :
Dans de nombreux cas, lorsque j'ai rencontré le problème de générer trop de fonctionnalités à partir d'une colonne avec de nombreuses catégories, j'ai opté pour encodage binaire et cela a fonctionné très bien la plupart du temps et vaut donc peut-être une chance pour vous.
Imaginez que vous avez 9 fonctionnalités, que vous les marquez de 1 à 9 et que vous les encodez maintenant en binaire, vous obtiendrez:
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
C'est l'intuition de base derrière Binary Encoder .
Étant donné que 2 puissance 11 est 2048 et que vous pouvez avoir 2000 catégories environ, vous pouvez réduire vos catégories à 11 des colonnes de fonctionnalités au lieu de plusieurs (par exemple, 1999 dans le cas de one-hot)!
Étant donné un tableau incroyablement clairsemé, on pourrait utiliser une technique de réduction de dimensionnalité telle que l'ACP (analyse en composantes principales) pour réduire l'espace des caractéristiques aux k caractéristiques les plus élevées qui décrivent le mieux la variance.
En supposant que les fonctionnalités MultiLabelBinarizered 2000 = X
model.explained_variance_
Et puis vous pouvez utiliser les K principaux composants comme un espace de fonctionnalités dimensionnel plus petit qui peut expliquer une grande partie de la variance pour l'espace de fonctionnalités d'origine.
Si vous voulez comprendre dans quelle mesure le nouvel espace de fonctionnalités plus petit décrit la variance, vous pouvez utiliser la commande suivante
from sklearn.decomposition import PCA k = 5 model = PCA(n_components = k, random_state = 666) model.fit(X) Components = model.predict(X)
J'ai également rencontré ces mêmes problèmes mais j'ai résolu en utilisant Countvectorizer
de sklearn.feature_extraction.text
simplement en donnant binary = True
, c'est-à-dire < code> CounterVectorizer (binaire = Vrai)