GridSearchCV и Ridge: подбор alpha без утечки
Настройте Ridge через GridSearchCV, поместив StandardScaler внутрь Pipeline. Затем оцените победителя на отдельной валидации и проверьте, по каким данным вычислены средние скейлера.
Программа курса «Классическое машинное обучение: алгоритмы и практика на Python».
Подбор гиперпараметра Ridge через конвейер GridSearchCV
Что уже дано
Проверяющая система запускает решение в среде Python 3.12 с библиотеками numpy, pandas и scikit-learn. Никаких глобальных переменных или файлов заранее не создаётся. Проверяющие тесты напрямую вызывают функцию tune_ridge_pipeline.
Что нужно сделать
Реализуйте функцию tune_ridge_pipeline(X_train, y_train, X_val, y_val, alphas, n_splits).
Функция настраивает силу регуляризации гребневой регрессии со стандартизацией признаков:
- Поиск лучшего
alphaиз спискаalphasвыполняется с помощьюGridSearchCVпо схеме кросс-валидацииKFold(n_splits=n_splits, shuffle=True, random_state=42)со скорингом MAE (neg_mean_absolute_error). - Масштабирование признаков (
StandardScaler, шаг с именем'scale') и регрессия (Ridge, шаг с именем'model') объединены вPipeline, чтобы исключить утечку данных из внутренних проверочных фолдов. - Поиск и кросс-валидация проводятся исключительно на обучающих данных
X_train,y_train. Параметрrefit=Trueобеспечивает автоматическое переобучение конвейера-победителя на всей обучающей выборке. - Валидационная выборка
X_val,y_valиспользуется только после поиска для оценки итогового качества полученного лучшего конвейера (best_estimator_).
Функция должна вернуть словарь dict с 4 ключами:
"best_alpha": выбранное оптимальное значениеalpha(скалярintилиfloat);"best_cv_mae": средняя абсолютная ошибка на кросс-валидации для лучшего кандидата (положительное скалярное числоfloat);"val_mae": средняя абсолютная ошибка на отложенной выборке(X_val, y_val)(скалярное числоfloat);"scaler_mean": одномерный массивnp.ndarrayвещественного типа (np.floating), содержащий средние значения признаковmean_, вычисленные скейлером конвейера-победителя при финальном переобучении (refit).
Ввод и вывод
stdin не используется. Печатать через print в stdout ничего не нужно. Функцию вызывает проверяющая система.
Сигнатура функции:
def tune_ridge_pipeline(X_train, y_train, X_val, y_val, alphas, n_splits) -> dict:
Аргументы:
X_train: числовой двумерный массивnp.ndarrayразмера(N_train, D)или соответствующийpd.DataFrame;y_train: числовой одномерный вектор меток длиныN_train;X_val: числовой двумерный массив размера(N_val, D)или соответствующийpd.DataFrame;y_val: числовой одномерный вектор длиныN_val;alphas: список положительных чисел для перебора регуляризацииalpha;n_splits: целое число внутренних фолдов дляKFold().
Возвращаемое значение:
Словарь dict со следующей структурой и типами:
"best_alpha":intилиfloat(скаляр);"best_cv_mae":float(скаляр);"val_mae":float(скаляр);"scaler_mean": одномерныйnp.ndarrayсndim == 1и вещественным типомnp.floating.
Пример использования
import numpy as np
X_tr = np.array([[1.0, 10.0], [2.0, 20.0], [3.0, 15.0], [4.0, 25.0], [5.0, 30.0], [6.0, 35.0]])
y_tr = np.array([2.1, 4.2, 5.0, 7.9, 10.1, 12.0])
X_v = np.array([[7.0, 40.0], [8.0, 45.0]])
y_v = np.array([14.1, 16.0])
res = tune_ridge_pipeline(X_tr, y_tr, X_v, y_v, alphas=[0.1, 1.0, 10.0], n_splits=3)
print(res["best_alpha"], round(res["best_cv_mae"], 3), round(res["val_mae"], 3), np.round(res["scaler_mean"], 2).tolist())
Результат:
0.1 0.291 0.083 [3.5, 22.5]
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
