Identificazione delle funzionalità filtrate dopo la selezione delle funzionalità con scikit learn


10

Ecco il mio codice per il metodo di selezione delle funzionalità in 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)

Ma dopo aver ottenuto la nuova X (variabile dipendente - X_new), come faccio a sapere quali variabili vengono rimosse e quali variabili vengono considerate in questa nuova variabile aggiornata? (quale rimosso o quali tre sono presenti nei dati.)

Il motivo per ottenere questa identificazione è applicare lo stesso filtro sui nuovi dati di test.

Risposte:


6

Ci sono due cose che puoi fare:

  • Controlla coef_param e rileva quale colonna è stata ignorata
  • Utilizzare lo stesso modello per la trasformazione dei dati di input utilizzando il metodo transform

Piccole modifiche per il tuo esempio

>>> 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.        ]]

Come vedi il metodo transformfa tutto il lavoro per te. E anche dalla coef_matrice puoi vedere l'ultima colonna solo un vettore zero, quindi il modello ignora l'ultima colonna dai dati


Ciao, come posso identificare i nomi delle colonne di X_train_new. C'è qualche funzione?
Vignesh Prajapati,

1
Sono nello stesso ordine del set di dati di input. iris.feature_names
itdxer,

Sì. Suo. Sono confuso qui. È nello stesso ordine. Ma come ottengo i loro nomi perché alcune colonne sono state ignorate. Quindi, non sono in grado di ottenere quelle colonne specifiche che sono state selezionate durante questo processo. Potete per favore aiutarmi su questo !.
Vignesh Prajapati,

Hai controllato il metodo feature_namesin irisvariabile? Funziona bene per me.
itdxer,

12

In alternativa, se si utilizza SelectFromModel per la selezione delle funzionalità dopo aver adattato SVC, è possibile utilizzare il metodo dell'istanza get_support. Ciò restituisce un array booleano che mappa la selezione di ciascuna funzione. Quindi unisciti a questo con un array di nomi di funzionalità originale, quindi filtra gli stati booleani per produrre il set di nomi delle funzionalità selezionate pertinenti.

Spero che questo aiuti i futuri lettori che hanno anche lottato per trovare il modo migliore per ottenere nomi rilevanti dopo la selezione.

Esempio:

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
Questo dovrebbe essere accettato
user0

5

Sulla base della soluzione @chinnychinchin, di solito faccio:

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()]) 

che restituisce qualcosa del tipo:

Index([u'feature1', u'feature2', u'feature',
  u'feature4'],
  dtype='object')
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.