Как получить список бесполезных функций с помощью sklearn?

У меня есть набор данных для создания классификатора:

dataset = pd.read_csv(sys.argv[1], decimal=",",delimiter=";", encoding='cp1251')
X=dataset.ix[:, dataset.columns != 'class']
Y=dataset['class']

Я хочу выбрать только важные функции, поэтому я делаю:

clf=svm.SVC(probability=True, gamma=0.017, C=5, coef0=0.00001, kernel='linear', class_weight='balanced')
model = SelectFromModel(clf, prefit=True)
X_train, X_test, Y_train, Y_test = cross_validation.train_test_split(X, Y, test_size=0.5, random_state=5)
y_pred=clf.fit(X_train, Y_train).predict(X_test)
X_new = model.transform(X)

Таким образом, X_new имеет размер 3000x72, а X — 3000x130. Я хотел бы получить список функций, которые есть и которых нет в X_new. Как мне это сделать?

X был кадром данных с заголовком, но X_new — это список списков со значениями функций без какого-либо имени, поэтому я не могу его объединить, как в пандах. Спасибо за любую помощь!


person Polly    schedule 28.09.2016    source источник
comment
Не могли бы вы привести пример всего в нескольких строках того, как будут выглядеть X_new и X и каков будет результат?   -  person Nickil Maveli    schedule 28.09.2016


Ответы (3)


clf.coef_ возвращает список весов функций (применяется после fit()). Отсортируйте его по весу, и вы увидите, какие из них не очень полезны.

person sergzach    schedule 28.09.2016
comment
но если я не ошибаюсь, он не дает мне список имен функций, а просто упорядоченные коэффициенты, которые я уже получил с помощью selectfrommodel - person Polly; 28.09.2016
comment
Ваш классификатор ничего не знает об именах в исходном DataFrame, поэтому я бы рекомендовал создать его вручную, что-то вроде weights = pd.DataFrame({'features': df.columns, 'weights': clf.coef_}) - person arsenyinfo; 28.09.2016
comment
@arsenyinfo Я думаю, вам не нужны имена. Порядок такой же, как и в ваших объектах (X). - person sergzach; 28.09.2016

Вы также можете взглянуть на Выбор функций. В нем описываются некоторые приемы и инструменты, позволяющие делать это более систематически.

person shahins    schedule 28.09.2016

Попробуйте запустить этот код:

import pandas as pd
import numpy as np

dataset = pd.read_csv(sys.argv[1], decimal=",",delimiter=";", encoding='cp1251')
X=dataset.ix[:, dataset.columns != 'class'].values
Y=dataset['class'].values
feature_names = data_churn.columns.tolist()
feature_names.remove('class')

from sklearn.feature_selection import SelectFromModel
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
clf = SVC(probability=True, gamma=0.017, C=5, coef0=0.00001, kernel='linear', class_weight='balanced')
model = SelectFromModel(clf, prefit=True)
X_train, X_test, Y_train, Y_test = train_test_split(X, y, test_size=0.5, random_state=5)
y_pred=clf.fit(X_train, Y_train).predict(X_test)
X_new = model.transform(X)
print pd.DataFrame(np.c_[feature_names, model.get_support(0)],
                         columns=[ 'feature_name', 'feature_selected'])

Столбцы «feature_selected» показывают, выбрана функция или нет.

person prashanth    schedule 01.02.2017