Использование скейлера в Sklearn PIpeline и кросс-валидации - PullRequest
1 голос
/ 29 мая 2020

Я ранее видел сообщение с таким кодом:

scalar = StandardScaler()
clf = svm.LinearSVC()

pipeline = Pipeline([('transformer', scalar), ('estimator', clf)])

cv = KFold(n_splits=4)
scores = cross_val_score(pipeline, X, y, cv = cv)

Я так понимаю: когда мы применяем масштабатор, мы должны использовать 3 из 4 раза до вычислить среднее и стандартное отклонение, затем мы применяем среднее и стандартное отклонение ко всем 4 раза.

В приведенном выше коде, как я могу узнать, что Sklearn следует тому же стратегия? С другой стороны, если sklearn не следует той же стратегии, это означает, что sklearn будет вычислять среднее / стандартное значение для всех 4 складок. Означает ли это, что мне не следует использовать приведенные выше коды?

Мне нравятся приведенные выше коды, потому что они экономят массу времени.

Ответы [ 2 ]

0 голосов
/ 29 мая 2020

Да, это сделано правильно; это одна из причин использования конвейеров: вся предварительная обработка выполняется только на обучающих свертках.


Некоторые ссылки.

Раздел 6.1.1 Руководство пользователя:

Безопасность
Конвейеры помогают избежать утечки статистики из ваших тестовых данных в обученную модель при перекрестной проверке, гарантируя, что одни и те же образцы используются для обучения преобразователи и предикторы.

Примечание в конце раздела 3.1.1 Руководства пользователя :

Преобразование данных с удерживаемые данные
Так же, как важно протестировать предиктор на данных, удерживаемых в результате обучения, предварительной обработки (такой как стандартизация, выбор функций и т. д. c.) и аналогичных преобразований данных аналогичным образом следует изучить из обучающий набор и применяется к удерживаемым данным для прогнозирования:
... пример кода ...
Конвейер упрощает составление оценщиков, обеспечивая такое поведение при перекрестной проверке:
.. .

Наконец, вы можете заглянуть в исходный код cross_val_score. Он вызывает cross_validate, который клонирует и соответствует оценщику (в данном случае всему конвейеру) для каждой обучающей группы. ссылка на GitHub .

0 голосов
/ 29 мая 2020

В приведенном вами примере я бы добавил дополнительный шаг, используя sklearn.model_selection.train_test_split:

folds = 4

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=(1/folds), random_state=0, stratify=y)

scalar = StandardScaler()
clf = svm.LinearSVC()

pipeline = Pipeline([('transformer', scalar), ('estimator', clf)])

cv = KFold(n_splits=(folds - 1))
scores = cross_val_score(pipeline, X_train, y_train, cv = cv)

Я думаю, что лучше всего использовать только набор обучающих данных (т.е. X_train, y_train) при настройке гиперпараметры вашей модели и набор тестовых данных (например, X_test, y_test) следует использовать в качестве окончательной проверки, чтобы убедиться, что ваша модель не смещена в сторону складок проверки. В этот момент вы примените тот же scaler, который вы поместите в свой набор данных обучения, к набору данных тестирования.

...