Выбор модели для Lasso-регрессии

Machine LearningMachine LearningBeginner
Практиковаться сейчас

This tutorial is from open-source community. Access the source code

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии мы узнаем, как выбрать наилучший гиперпараметр alpha для моделей Lasso-регрессии. Будут рассмотрены два подхода: (1) выбор оптимального значения alpha только на основе обучающей выборки и некоторых критериев информативности, и (2) выбор наилучшего гиперпараметра с использованием кросс-валидации. В этом примере мы будем использовать датасет о диабете.

Советы по использованию ВМ

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

Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook полностью загрузится. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если вы столкнетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/DataPreprocessingandFeatureEngineeringGroup(["Data Preprocessing and Feature Engineering"]) sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/linear_model("Linear Models") sklearn/DataPreprocessingandFeatureEngineeringGroup -.-> sklearn/preprocessing("Preprocessing and Normalization") sklearn/DataPreprocessingandFeatureEngineeringGroup -.-> sklearn/pipeline("Pipeline") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/linear_model -.-> lab-49192{{"Выбор модели для Lasso-регрессии"}} sklearn/preprocessing -.-> lab-49192{{"Выбор модели для Lasso-регрессии"}} sklearn/pipeline -.-> lab-49192{{"Выбор модели для Lasso-регрессии"}} sklearn/datasets -.-> lab-49192{{"Выбор модели для Lasso-регрессии"}} ml/sklearn -.-> lab-49192{{"Выбор модели для Lasso-регрессии"}} end

Датасет

Сначала мы загрузим датасет о диабете с использованием функции load_diabetes из sklearn.datasets. Датасет состоит из 10 базовых переменных: возраста, пола, индекса массы тела, среднего артериального давления и шести измерений сыворотки крови, а также количественной меры прогрессии заболевания за год после базовой отметки.

from sklearn.datasets import load_diabetes

X, y = load_diabetes(return_X_y=True, as_frame=True)
X.head()

Добавление случайных признаков

Мы добавим некоторые случайные признаки к исходным данным, чтобы лучше проиллюстрировать отбор признаков, выполняемый моделью Lasso. Случайные признаки будут генерироваться с использованием функции RandomState из numpy.

import numpy as np
import pandas as pd

rng = np.random.RandomState(42)
n_random_features = 14
X_random = pd.DataFrame(
    rng.randn(X.shape[0], n_random_features),
    columns=[f"random_{i:02d}" for i in range(n_random_features)],
)
X = pd.concat([X, X_random], axis=1)
X[X.columns[::3]].head()

Выбор Lasso с использованием критерия информативности

Мы будем использовать функцию LassoLarsIC из sklearn.linear_model, чтобы получить оценщик Lasso, который использует критерий информационного качества Акаике (AIC) или критерий Байеса (BIC) для выбора оптимального значения параметра регуляризации alpha. Сначала мы обучим модель Lasso с использованием критерия AIC.

import time
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LassoLarsIC
from sklearn.pipeline import make_pipeline

start_time = time.time()
lasso_lars_ic = make_pipeline(StandardScaler(), LassoLarsIC(criterion="aic")).fit(X, y)
fit_time = time.time() - start_time

Сохранение результатов и проверка оптимального alpha

Мы сохраним метрику AIC для каждого значения alpha, используемого при вызове fit. Затем мы проведем аналогичный анализ с использованием критерия BIC. Наконец, мы проверим, какое значение alpha приводит к минимальному AIC и BIC.

results = pd.DataFrame(
    {
        "alphas": lasso_lars_ic[-1].alphas_,
        "AIC criterion": lasso_lars_ic[-1].criterion_,
    }
).set_index("alphas")
alpha_aic = lasso_lars_ic[-1].alpha_

lasso_lars_ic.set_params(lassolarsic__criterion="bic").fit(X, y)
results["BIC criterion"] = lasso_lars_ic[-1].criterion_
alpha_bic = lasso_lars_ic[-1].alpha_

def highlight_min(x):
    x_min = x.min()
    return ["font-weight: bold" if v == x_min else "" for v in x]

results.style.apply(highlight_min)

Построение графиков значений AIC и BIC

Наконец, мы построим графики значений AIC и BIC для различных значений alpha. Вертикальные линии на графике соответствуют alpha, выбранному для каждого критерия. Выбранное alpha соответствует минимуму критерия AIC или BIC.

ax = results.plot()
ax.vlines(
    alpha_aic,
    results["AIC criterion"].min(),
    results["AIC criterion"].max(),
    label="alpha: AIC estimate",
    linestyles="--",
    color="tab:blue",
)
ax.vlines(
    alpha_bic,
    results["BIC criterion"].min(),
    results["BIC criterion"].max(),
    label="alpha: BIC estimate",
    linestyle="--",
    color="tab:orange",
)
ax.set_xlabel(r"$\alpha$")
ax.set_ylabel("criterion")
ax.set_xscale("log")
ax.legend()
_ = ax.set_title(
    f"Information-criterion for model selection (training time {fit_time:.2f}s)"
)

Выбор Lasso с использованием кросс-валидации

Мы будем использовать два различных оценивателя для выбора наилучшего гиперпараметра alpha с интегрированной кросс-валидацией: LassoCV и LassoLarsCV. Для обоих алгоритмов мы будем использовать стратегию 20-кратной кросс-валидации.

Lasso с использованием координатного спуска

Мы будем настраивать гиперпараметры с использованием LassoCV.

from sklearn.linear_model import LassoCV

start_time = time.time()
model = make_pipeline(StandardScaler(), LassoCV(cv=20)).fit(X, y)
fit_time = time.time() - start_time

Lasso с использованием наименьшего углового регрессии

Мы будем настраивать гиперпараметры с использованием LassoLarsCV.

from sklearn.linear_model import LassoLarsCV

start_time = time.time()
model = make_pipeline(StandardScaler(), LassoLarsCV(cv=20)).fit(X, y)
fit_time = time.time() - start_time

Резюме подхода кросс-валидации

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

Резюме

В этом практическом занятии мы узнали, как выбирать наилучший гиперпараметр alpha для моделей Lasso-регрессии. Мы обсудили два подхода: (1) выбор оптимального значения alpha только с использованием обучающей выборки и некоторых критериев информативности, и (2) выбор наилучшего гиперпараметра с использованием кросс-валидации. В этом примере мы использовали датасет по диабету. Оба подхода могут давать сходные результаты, но выбор гиперпараметров на основе обучающей выборки показывает свою эффективность в терминах вычислительной производительности. Однако, его можно использовать только в том случае, если количество выборок достаточно велико по сравнению с количеством признаков. Оптимизация гиперпараметров с использованием кросс-валидации - это безопасная стратегия, которая работает в различных условиях.