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]
РешениеPython

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Связанные задачи