Визначення відфільтрованих функцій після вибору функцій за допомогою scikit learn


10

Ось мій код вибору функції в 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)

Але після отримання нової X (залежної змінної - X_new), як я можу знати, які змінні видаляються та які змінні враховуються в цій новій оновленій змінній? (яке з них видалено або три, які є у даних.)

Причина отримання цієї ідентифікації полягає в застосуванні тієї ж фільтрації на нових тестових даних.

Відповіді:


6

Можна зробити дві речі:

  • Перевірте coef_парам і виявіть, який стовпець був проігнорований
  • Використовуйте ту ж модель для перетворення вхідних даних за допомогою методу transform

Невеликі модифікації для вашого прикладу

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

Як ви бачите, метод transformробить всю роботу за вас. А також з coef_матриці ви бачите, що останній стовпець є лише нульовим вектором, тому ви моделюєте ігноруючи останній стовпець із даних


Привіт, як я можу визначити імена стовпців X_train_new. Чи є якась функція?
Vignesh Prajapati

1
Вони в тому ж порядку, що і у наборі вхідних даних. iris.feature_names
itdxer

Так. Його. Я тут розгублений. Це в тому ж порядку. Але як я можу їх імена, оскільки частина стовпців була проігнорована. Отже, я не в змозі отримати ті конкретні стовпці, які були вибрані під час цього процесу. Чи можете ви мені допомогти в цьому?
Vignesh Prajapati

Ви перевіряли метод feature_namesу irisзмінній? Це прекрасно працює для мене.
itdxer

12

Крім того, якщо ви використовуєте SelectFromModel для вибору функцій після установки SVC, ви можете використовувати метод примірника get_support. Це повертає булевий масив, відображаючи вибір кожної функції. Далі з'єднайте це з масивом оригінальних імен функцій, а потім фільтруйте булові статуси, щоб створити набір відповідних імен вибраних функцій.

Сподіваємось, це допомагає майбутнім читачам, які також намагалися знайти найкращий спосіб отримати відповідні імена функцій після вибору функції.

Приклад:

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
Це слід прийняти
користувач0

5

На основі рішення @chinnychinchin я зазвичай роблю:

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

який повертає щось на кшталт:

Index([u'feature1', u'feature2', u'feature',
  u'feature4'],
  dtype='object')
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.