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.

Vignesh Prajapati
la source

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

itdxer
la source
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()) 
chinnychinchin
la source
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')
ruloweb
la source