Identification des fonctionnalités filtrées après la sélection des fonctionnalités avec scikit learn


10

Voici mon code pour la méthode de sélection des fonctionnalités en Python:

from sklearn.svm import LinearSVC
from sklearn.datasets import load_iris
iris = load_iris()
X, y = iris.data, iris.target
X.shape
(150, 4)
X_new = LinearSVC(C=0.01, penalty="l1", dual=False).fit_transform(X, y)
X_new.shape
(150, 3)

Mais après avoir obtenu un nouveau X (variable dépendante - X_new), comment savoir quelles variables sont supprimées et quelles variables sont prises en compte dans cette nouvelle variable mise à jour? (lequel a été supprimé ou trois sont présents dans les données.)

La raison pour obtenir cette identification est d'appliquer le même filtrage sur les nouvelles données de test.

Réponses:


6

Vous pouvez faire deux choses:

  • Vérifier les coef_paramètres et détecter quelle colonne a été ignorée
  • Utilisez le même modèle pour la transformation des données d'entrée à l'aide de la méthode transform

Petites modifications pour votre exemple

>>> from sklearn.svm import LinearSVC
>>> from sklearn.datasets import load_iris
>>> from sklearn.cross_validation import train_test_split
>>>
>>> iris = load_iris()
>>> x_train, x_test, y_train, y_test = train_test_split(
...     iris.data, iris.target, train_size=0.7
... )
>>>
>>> svc = LinearSVC(C=0.01, penalty="l1", dual=False)
>>>
>>> X_train_new = svc.fit_transform(x_train, y_train)
>>> print(X_train_new.shape)
(105, 3)
>>>
>>> X_test_new = svc.transform(x_test)
>>> print(X_test_new.shape)
(45, 3)
>>>
>>> print(svc.coef_)
[[ 0.          0.10895557 -0.20603044  0.        ]
 [-0.00514987 -0.05676593  0.          0.        ]
 [ 0.         -0.09839843  0.02111212  0.        ]]

Comme vous le voyez, la méthode transformfait tout le travail pour vous. Et aussi à partir de la coef_matrice, vous pouvez voir cette dernière colonne juste un vecteur nul, donc vous modélisez ignorer la dernière colonne des données


Bonjour, Comment puis-je identifier les noms de colonne de X_train_new. Y a-t-il une fonction?
Vignesh Prajapati

1
Ils sont dans le même ordre que dans l'ensemble de données d'entrée. iris.feature_names
itdxer

Oui. Ses. Je suis confus ici. C'est dans le même ordre. Mais comment puis-je obtenir leurs noms car certaines colonnes ont été ignorées. Donc, je ne suis pas en mesure d'obtenir ces colonnes spécifiques qui ont été sélectionnées pendant ce processus. Pouvez-vous m'aider s'il vous plaît à ce sujet!.
Vignesh Prajapati

Avez-vous vérifié la méthode feature_namesen irisvariable? Ça fonctionne bien pour moi.
itdxer

12

Alternativement, si vous utilisez SelectFromModel pour la sélection de fonctionnalités après avoir installé votre SVC, vous pouvez utiliser la méthode d'instance get_support. Cela renvoie un tableau booléen mappant la sélection de chaque entité. Ensuite, joignez-le à un tableau de noms de fonctionnalités d'origine, puis filtrez les statuts booléens pour produire l'ensemble des noms de fonctionnalités sélectionnés pertinents.

J'espère que cela aidera les futurs lecteurs qui ont également eu du mal à trouver le meilleur moyen d'obtenir des noms de fonctionnalités pertinents après la sélection des fonctionnalités.

Exemple:

lsvc = LinearSVC(C=0.01, penalty="l1", dual=False,max_iter=2000).fit(X, y) 
model = sk.SelectFromModel(lsvc, prefit=True) 
X_new = model.transform(X) 
print(X_new.shape) 
print(model.get_support()) 

5
Cela devrait être accepté
user0

5

Basé sur la solution @chinnychinchin, je fais habituellement:

lsvc = LinearSVC(C=0.01, penalty="l1", dual=False,max_iter=2000).fit(X, y) 
model = sk.SelectFromModel(lsvc, prefit=True) 
X_new = model.transform(X) 
print(X.columns[model.get_support()]) 

qui renvoie quelque chose comme:

Index([u'feature1', u'feature2', u'feature',
  u'feature4'],
  dtype='object')
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.