Identyfikacja przefiltrowanych funkcji po wybraniu funkcji za pomocą scikit learn

10

Oto mój kod metody wyboru funkcji w Pythonie:

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)

Ale po uzyskaniu nowego X (zmienna zależna - X_new), skąd mam wiedzieć, które zmienne są usuwane, a które zmienne są uwzględniane w tej nowej zaktualizowanej zmiennej? (które usunięto lub które trzy są obecne w danych).

Powodem uzyskania tej identyfikacji jest zastosowanie tego samego filtrowania do nowych danych testowych.

Vignesh Prajapati
źródło

Odpowiedzi:

6

Istnieją dwie rzeczy, które możesz zrobić:

  • Sprawdź coef_parametry i wykryj, która kolumna została zignorowana
  • Użyj tego samego modelu do transformacji danych wejściowych przy użyciu metody transform

Małe modyfikacje dla twojego przykładu

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

Jak widzisz, transformwykonaj całą pracę za Ciebie. A także z coef_macierzy widać, że ostatnia kolumna jest tylko zerowym wektorem, więc model ignoruje ostatnią kolumnę z danych

itdxer
źródło
Cześć, jak mogę zidentyfikować nazwy kolumn X_train_new. Czy jest jakaś funkcja?
Vignesh Prajapati
1
Są w tej samej kolejności, co w zestawie danych wejściowych. iris.feature_names
itdxer
Tak. Jego. Jestem tu zmieszany. Jest w tej samej kolejności. Ale jak mogę uzyskać ich nazwy, ponieważ niektóre kolumny zostały zignorowane. Tak więc nie jestem w stanie uzyskać tych konkretnych kolumn, które zostały wybrane podczas tego procesu. Czy możesz mi pomóc w tej sprawie!
Vignesh Prajapati,
Czy sprawdziłeś metodę feature_namesw iriszmiennej? Działa dla mnie dobrze.
itdxer
12

Alternatywnie, jeśli używasz SelectFromModel do wyboru funkcji po dopasowaniu SVC, możesz użyć metody instancji get_support. Zwraca tablicę boolowską mapującą wybór każdej funkcji. Następnie połącz to z oryginalną tablicą nazw operacji, a następnie przefiltruj statusy boolowskie, aby utworzyć zestaw odpowiednich nazw wybranych operacji.

Mam nadzieję, że pomoże to przyszłym czytelnikom, którzy również mieli trudności ze znalezieniem najlepszego sposobu uzyskania odpowiednich nazw funkcji po wybraniu funkcji.

Przykład:

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
źródło
5
Należy to zaakceptować
użytkownik0
5

W oparciu o rozwiązanie @chinnychinchin zwykle robię:

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

co zwraca coś takiego:

Index([u'feature1', u'feature2', u'feature',
  u'feature4'],
  dtype='object')
ruloweb
źródło