Определение отфильтрованных объектов после выбора функции с помощью 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_матрицы вы можете увидеть, что последний столбец просто нулевой вектор, поэтому вы моделируете игнорировать последний столбец из данных

itdxer
источник
Привет, Как я могу определить имена столбцов X_train_new. Есть ли какая-нибудь функция?
Виньеш Праджапати
1
Они в том же порядке, что и во входных данных. iris.feature_names
itdxer
Да. Это. Я запутался здесь. Это в том же порядке. Но как я могу получить их имена, потому что некоторые из столбцов были проигнорированы. Итак, я не могу получить те конкретные столбцы, которые были выделены во время этого процесса. Не могли бы вы помочь мне в этом!
Виньеш Праджапати
Вы проверяли метод 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()) 
chinnychinchin
источник
5
Это должно быть принято
user0
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')
ruloweb
источник