Identifizieren gefilterter Features nach Feature-Auswahl mit scikit learn

10

Hier ist mein Code für die Feature-Auswahlmethode 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)

Aber nachdem ich neues X (abhängige Variable - X_new) erhalten habe, woher weiß ich, welche Variablen entfernt werden und welche Variablen in dieser neuen aktualisierten Variablen berücksichtigt werden? (Welches wurde entfernt oder welche drei sind in den Daten vorhanden?)

Der Grund für diese Identifizierung besteht darin, auf neue Testdaten dieselbe Filterung anzuwenden.

Vignesh Prajapati
quelle

Antworten:

6

Sie können zwei Dinge tun:

  • Überprüfen Sie den coef_Parameter und stellen Sie fest, welche Spalte ignoriert wurde
  • Verwenden Sie dasselbe Modell für die Transformation von Eingabedaten mithilfe der Methode transform

Kleine Modifikationen für Ihr Beispiel

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

Wie Sie sehen, transformerledigen Sie alle Aufgaben für Sie. Außerdem coef_können Sie anhand der Matrix sehen, dass die letzte Spalte nur ein Nullvektor ist, sodass Sie die letzte Spalte aus den Daten ignorieren

itdxer
quelle
Hallo, wie kann ich die Spaltennamen von X_train_new identifizieren? Gibt es eine Funktion?
Vignesh Prajapati
1
Sie befinden sich in derselben Reihenfolge wie im Eingabedatensatz. iris.feature_names
Itdxer
Ja. Es ist. Ich bin hier verwirrt. Es ist in der gleichen Reihenfolge. Aber wie bekomme ich ihre Namen, weil einige der Spalten ignoriert wurden. Daher kann ich die spezifischen Spalten, die während dieses Vorgangs ausgewählt wurden, nicht abrufen. Können Sie mir bitte dabei helfen?
Vignesh Prajapati
Haben Sie die Methode feature_namesin irisVariable überprüft ? Es funktioniert gut für mich.
itdxer
12

Wenn Sie nach dem Anpassen Ihres SVC SelectFromModel für die Funktionsauswahl verwenden, können Sie alternativ die Instanzmethode verwenden get_support. Dies gibt ein boolesches Array zurück, das die Auswahl jedes Features abbildet. Verbinden Sie dies als Nächstes mit einem ursprünglichen Array mit Feature-Namen und filtern Sie dann nach den booleschen Status, um den Satz der Namen der relevanten ausgewählten Features zu erstellen.

Ich hoffe, dies hilft zukünftigen Lesern, die auch Schwierigkeiten hatten, den besten Weg zu finden, um relevante Feature-Namen nach der Feature-Auswahl zu erhalten.

Beispiel:

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()) 
chinny Chin Chin
quelle
5
Dies sollte akzeptiert werden
user0
5

Basierend auf der @ chinnychinchin-Lösung mache ich normalerweise:

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

was so etwas zurückgibt wie:

Index([u'feature1', u'feature2', u'feature',
  u'feature4'],
  dtype='object')
ruloweb
quelle