Как извлечь важные функции после перекрестной проверки в k-кратном порядке, с конвейером или без него? - PullRequest
1 голос
/ 12 июня 2019

Я хочу построить классификатор, который использует перекрестную проверку, а затем извлечь важные характеристики (/ коэффициенты) из каждого сгиба, чтобы я мог посмотреть на их стабильность.На данный момент я использую cross_validate и конвейер.Я хочу использовать конвейер, чтобы я мог выбирать и стандартизировать функции в каждом сгибе.Я застрял на том, как извлечь функции из каждого сгиба.У меня есть другой вариант использования конвейера ниже, если это проблема.

Пока это мой код (я хочу попробовать SVM и логистическую регрессию).Я включил небольшой df в качестве примера:

from sklearn.preprocessing import StandardScaler
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import mutual_info_classif
from sklearn.model_selection import cross_validate
from sklearn.model_selection import KFold
from sklearn.pipeline import Pipeline
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
import pandas as pd

df = pd.DataFrame({'length': [5, 8, 0.2, 10, 25, 3.2], 
                   'width': [60, 102, 80.5, 30, 52, 81],
                   'group': [1, 0, 0, 0, 1, 1]})

array = df.values
y = array[:,2]
X = array[:,0:2]

select = SelectKBest(mutual_info_classif, k=2)
scl = StandardScaler()
svm = SVC(kernel='linear', probability=True, random_state=42)
logr = LogisticRegression(random_state=42)

pipeline = Pipeline([('select', select), ('scale', scl), ('svm', svm)])

split = KFold(n_splits=2, shuffle=True, random_state=42)

output = cross_validate(pipeline, X, y, cv=split, 
                scoring = ('accuracy', 'f1', 'roc_auc'),
                return_estimator = True,
                return_train_score= True)

Я думал, что мог бы сделать что-то вроде:

pipeline.named_steps['svm'].coef_

, но я получаю сообщение об ошибке:

AttributeError: 'SVC' object has no attribute 'dual_coef_'

Если это невозможно сделать с помощью конвейера, могу ли я сделать это с помощью перекрестной проверки «вручную»?Например:

for train_index, test_index in kfold.split(X, y):

        kfoldtx = [X[i] for i in train_index]
        kfoldty = [y[i] for i in train_index]

Но я не уверен, что делать дальше!Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 13 июня 2019

Вы должны использовать output из cross_validate, чтобы получить параметры подходящей модели. Причина в том, что cross_validate будет клонировать конвейер. Следовательно, вы не найдете, что данная переменная pipeline будет установлена ​​после подачи на cross_validate.

output - это словарь, в котором одним из ключей является estimator, значение которого равно k_fold числу установленных pipeline объектов.

С Документация :

return_estimator: логический, по умолчанию False

Нужно ли возвращать оценки, установленные для каждого разделения.

Попробуйте это!

>>> fitted_svc = output['estimator'][0].named_steps['svm'] # choosing the first fold comb
>>> fitted_svc.coef_

array([[1.05826838, 0.41630046]])
...