Я использовал sklearn.model_selection.cross_validate для перекрестной проверки sklearn.pipeline.Pipeline, и это прекрасно работает.

Теперь меня интересуют коэффициенты шага выбора признаков в пайплайне. Используется селектор SelectFromModel(LinearSVC(penalty="l1", dual=False)).

При установке return_estimator=True метод перекрестной проверки должен возвращать оценки, подходящие для каждого разделения. Это хорошо работает для классификатора:

>>> pipeline[-1].coef_
[ 0.20973553  0.48124347 -0.27811877 ... ]

Однако, когда я проверяю шаг выбора функции, возникает ошибка атрибута, поскольку объект еще не установлен:

>>> output = cross_validate(pipeline, X, y, cv=skf.split(X, data.cohort_idx), return_estimator=True)
>>> output['estimator'][1][-2].estimator.coef_
AttributeError: 'LinearSVC' object has no attribute 'coef_'

Подгонка этого шага впоследствии решает проблему, но будет громоздкой и подверженной ошибкам в процессе cross_validation:

>>> pipeline.fit(X, y)
>>> pipeline[3].estimator.coef_
[-0.27501591  0.14398988  0.83767175 ... ]

Как заставить cross_validate возвращать подходящий селектор функций?

Вы можете воспроизвести этот пример, используя:

import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_validate
from sklearn.pipeline import make_pipeline
from sklearn.feature_selection import SelectFromModel
from sklearn.svm import LinearSVC

# Make dummy data
X = np.random.rand(50, 4)
y = np.random.choice([True, False], 50)

# Make pipeline
selector = SelectFromModel(LinearSVC(penalty="l1", dual=False))
classifier = LogisticRegression()
pipeline = make_pipeline(selector, classifier)

# Cross validate
output = cross_validate(pipeline, X, y, return_estimator=True)

# Print coefficients
print('Classifier coef_:', output['estimator'][0][1].coef_)
print('Selector coef_:  ', output['estimator'][0][0].estimator.coef_)
0
M.G.Poirot 22 Ноя 2022 в 21:55

1 ответ

После завершения этого вопроса и непосредственно перед его отправкой я понял, что должен получить доступ к члену estimator_, а не estimator.

Надеюсь, однажды это кому-нибудь поможет.

0
M.G.Poirot 22 Ноя 2022 в 21:55