RFECV и поиск по сетке – какие наборы использовать для настройки гиперпараметров?

Вопрос или проблема

Я запускаю модели машинного обучения (все с использованием оценщиков из sci-kit learn, без нейронных сетей) на основании пользовательского набора данных с рядом признаков и биномиальным выходом. Я сначала разделяю набор данных на 0.6 (обучающий), 0.2 (валидационный), 0.2 (тестовый) наборы, перед предварительной обработкой и преобразованием в датафреймы.

Я использую RFECV с StratifiedKFold для поиска лучших признаков на обучающем наборе.

Затем я использую перебор параметров с помощью StratifiedKFold для настройки гиперпараметров перед тем, как обучить модель на объединенном обучающем и валидационном наборах и оценить производительность на тестовом наборе.

Мой вопрос: на каком наборе запускать перебор параметров? На обучающем наборе (потенциальное переобучение?), валидационном наборе или на объединенном обучающем и валидационном наборах (переобучение?).

Текущий фрагмент кода, если кому интересно, показывает настройку гиперпараметров только на валидационном наборе:

import pandas as pd
from sklearn.model_selection import cross_val_score, StratifiedKFold
from sklearn.model_selection import GridSearchCV
from sklearn.feature_selection import RFECV

estimator.fit(X_train_preprocessed_df, y_train)

custom_scorer = make_scorer(log_loss, greater_is_better=False, response_method='predict_proba')

# Инициализация RFECV
rfecv = RFECV(estimator=estimator, step=1, min_features_to_select=2, verbose=0, cv=StratifiedKFold(5), scoring=custom_scorer)

# Обучение RFECV
rfecv.fit(X_train_preprocessed_df, y_train)

# Получение выбранных признаков
selected_features = rfecv.support_
selected_feature_names = X_train_preprocessed_df.columns[selected_features]
print(f"Количество выбранных признаков: {selected_features.sum()}")
print("Выбранные признаки:", selected_feature_names.tolist())

# Обучение модели с выбранными признаками
estimator.fit(X_train_preprocessed_df.loc[:, selected_features], y_train)

# Преобразование обучающего, валидационного и тестового наборов для включения только выбранных признаков
X_train_selected = X_train_preprocessed_df.loc[:, selected_features]
X_val_selected = X_val_preprocessed_df.loc[:, selected_features]
X_test_selected = X_test_preprocessed_df.loc[:, selected_features]

# Инициализация GridSearchCV для настройки гиперпараметров с использованием объединенного обучающего и валидационного набора
grid_search = GridSearchCV(estimator=estimator, param_grid=param_grid, scoring=custom_scorer, cv=StratifiedKFold(5), verbose=0, n_jobs=-1)

# Обучение GridSearchCV на валидационном наборе
grid_search.fit(X_val_selected, y_val)

# Печать лучших параметров
print('Найдены лучшие параметры')
print(grid_search.best_params_)

# Печать лучшего оценщика
print('\nНайден лучший оценщик')
print(grid_search.best_estimator_)

# Получение лучшего оценщика из GridSearchCV
best_estimator = grid_search.best_estimator_

# Объединение обучающего и валидационного наборов для финального обучения
X_combined = pd.concat([X_train_selected, X_val_selected])
y_combined  = pd.concat([y_train, y_val])

# Обучение модели с лучшим оценщиком на объединенном наборе
best_estimator.fit(X_combined, y_combined)

# Оценка на валидационном наборе для настройки гиперпараметров
y_val_pred = best_estimator.predict(X_combined)
val_score = custom_scorer(best_estimator, X_combined, y_combined)
print(f"Оценка на валидационном наборе: {val_score}")

# Оценка на тестовом наборе для получения финальной производительности
y_test_pred = best_estimator.predict(X_test_selected)
test_score = custom_scorer(best_estimator, X_test_selected, y_test)
print(f"Оценка на тестовом наборе: {test_score}")

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

Для этого удобно и строго использовать конвейер scikit-learn, так как в теории вы также должны включать другие шаги предварительной обработки в цикл, такие как нормализация. Недостатком является то, что весь процесс будет медленным (вложенные циклы).

Для обучения gridsearchCV вы используете ваши обучающий+валидационный наборы вместе, так как различные валидационные разбиения будут созданы внутри gridsearch через кросс-валидацию.

Пример кода вы можете найти здесь.

Ответ или решение

Вопрос о том, какой набор данных использовать для подбора гиперпараметров через GridSearchCV в контексте вашей задачи, имеет критическое значение для достижения объективной оценки модели. Давайте рассмотрим теорию, примеры и применение, чтобы дать полный и профессиональный ответ на ваш вопрос.

Теория

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

Вы упомянули о применении RFECV (Recursive Feature Elimination with Cross-Validation) для выбора признаков, что уже является хорошей практикой. RFECV применяется на обучающем наборе для определения наилучшего набора признаков с помощью перекрестной проверки. Это помогает сузить пространство признаков, сфокусировавшись на тех, которые обладают наибольшей прогностической способностью, данный подход минимизирует вероятность переобучения на избыточных признаках.

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

Пример

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

В примере ниже показан практический подход к объединенному применению RFECV и GridSearchCV:

import pandas as pd
from sklearn.model_selection import StratifiedKFold, GridSearchCV
from sklearn.feature_selection import RFECV
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler

# Первичная обработка данных
scaler = StandardScaler()

# Инициализация RFECV
rfecv = RFECV(estimator=estimator, step=1, min_features_to_select=2, cv=StratifiedKFold(5), scoring=custom_scorer)

# Создаем пайплайн для скалирования и выбора признаков
pipeline = Pipeline(steps=[('scaler', scaler), ('feature_selection', rfecv)])

# Объединение сетов данных
X_combined = pd.concat([X_train_preprocessed_df, X_val_preprocessed_df])
y_combined  = pd.concat([y_train, y_val])

# Применение GridSearchCV на объединенной выборке
grid_search = GridSearchCV(estimator=pipeline, param_grid=param_grid, scoring=custom_scorer, cv=StratifiedKFold(5), verbose=0, n_jobs=-1)
grid_search.fit(X_combined, y_combined)

# Выбор и обучение лучшей модели
best_pipeline = grid_search.best_estimator_
best_pipeline.fit(X_combined, y_combined)

# Оценка на тестовом наборе
test_score = custom_scorer(best_pipeline, X_test_preprocessed_df, y_test)
print(f"Тестовая оценка: {test_score}")

Применение и рекомендации

Теперь, когда вы знаете теорию и видели пример, давайте рассмотрим, как лучше применять эти знания. Выбор подходящего набора данных для GridSearchCV на обучающем и валидационном наборе способствует тому, что вы используете как можно больше данных для обучения модели, и при этом сохраняется механизм валидации. Это позволяет сократить риск переобучения, потому что Cross-validation в GridSearchCV предоставляет наиболее сбалансированную оценку.

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

Наконец, ключевой момент, который стоит помнить — тестовая выборка должна оставаться "ченленджером", то есть она не включается в обучение ни на каком этапе, чтобы сохранить объективную оценку способов обобщения модели на новые, ранее не виденные данные.

Оцените материал
Добавить комментарий

Капча загружается...