Подгонка во вложенной перекрестной проверке с помощью cross_val_score с конвейером и GridSearch - PullRequest
0 голосов
/ 02 сентября 2018

Я работаю в Scikit и пытаюсь настроить свой XGBoost. Я предпринял попытку использовать вложенную перекрестную проверку с использованием конвейера для масштабирования тренировочных сгибов (чтобы избежать утечки данных и переобучения) и параллельно с GridSearchCV для настройки параметров и cross_val_score для получения оценки roc_auc в конце.

from imblearn.pipeline import Pipeline 
from sklearn.model_selection import RepeatedKFold 
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import cross_val_score
from xgboost import XGBClassifier


std_scaling = StandardScaler() 
algo = XGBClassifier()

steps = [('std_scaling', StandardScaler()), ('algo', XGBClassifier())]

pipeline = Pipeline(steps)

parameters = {'algo__min_child_weight': [1, 2],
              'algo__subsample': [0.6, 0.9],
              'algo__max_depth': [4, 6],
              'algo__gamma': [0.1, 0.2],
              'algo__learning_rate': [0.05, 0.5, 0.3]}

cv1 = RepeatedKFold(n_splits=2, n_repeats = 5, random_state = 15)

clf_auc = GridSearchCV(pipeline, cv = cv1, param_grid = parameters, scoring = 'roc_auc', n_jobs=-1, return_train_score=False)

cv1 = RepeatedKFold(n_splits=2, n_repeats = 5,  random_state = 15)                       
outer_clf_auc = cross_val_score(clf_auc, X_train, y_train, cv = cv1, scoring = 'roc_auc')

Вопрос 1. Как мне приспособить cross_val_score к данным тренировки?

Вопрос2. Поскольку я включил StandardScaler() в конвейер, имеет ли смысл включать X_train в cross_val_score или мне следует использовать стандартизированную форму X_train (т.е. std_X_train)?

std_scaler = StandardScaler().fit(X_train)
std_X_train = std_scaler.transform(X_train)
std_X_test = std_scaler.transform(X_test)

1 Ответ

0 голосов
/ 03 сентября 2018

Вы выбрали правильный способ избежать утечки данных, как говорите: вложенное резюме .

Дело в том, что во вложенном резюме вы оцениваете не реальную оценку, которую вы можете «держать в своих руках», а несуществующий «метаоценщик», который также описывает процесс выбора модели.

Значение - в каждом раунде внешней перекрестной проверки (в вашем случае, представленном cross_val_score ), оценщик clf_auc подвергается внутреннему CV, который выбирает лучшую модель из заданного сгиба внешнее резюме. Таким образом, для каждого сгиба внешнего резюме вы выставляете оценку, выбранную внутренним резюме.

Например, в одном внешнем сгибе CV набранной моделью может быть тот, который выбрал параметр algo__min_child_weight равным 1, а в другой модели, который выбрал его равным 2.

Таким образом, оценка внешнего резюме представляет собой более высокую оценку: «насколько хорошо будет обобщена моя выбранная модель в процессе разумного выбора модели».

Теперь, если вы хотите завершить процесс с реальной моделью в руках, вам придется каким-то образом выбрать ее (cross_val_score не сделает этого за вас).

Способ сделать это - теперь приспособить вашу внутреннюю модель ко всем данным. смысл выполнять:

clf_auc.fit(X, y)

Это момент, чтобы понять, что вы здесь сделали:

  1. У вас есть модель, которую вы можете использовать, которая соответствует всем имеющимся данным.
  2. Когда вас спрашивают "насколько хорошо эта модель обобщает новые данные?" ответ - это оценка, которую вы получили во время своего вложенного резюме, которое учитывало процесс выбора модели как часть оценки вашей модели.

А что касается Вопроса № 2 - если скейлер является частью конвейера, нет никаких причин манипулировать X_train извне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...