Sélection de modèle pour la régression Lasso

Machine LearningMachine LearningBeginner
Pratiquer maintenant

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

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Dans ce laboratoire, nous allons apprendre à sélectionner le meilleur hyperparamètre alpha pour les modèles de régression Lasso. Deux approches seront discutées : (1) sélectionner la valeur optimale d'alpha en utilisant uniquement l'ensemble d'entraînement et certains critères d'information, et (2) sélectionner le meilleur hyperparamètre en utilisant la validation croisée. Nous utiliserons le jeu de données sur le diabète dans cet exemple.

Conseils sur la machine virtuelle

Une fois le démarrage de la machine virtuelle terminé, cliquez dans le coin supérieur gauche pour basculer vers l'onglet Carnet de notes pour accéder à Jupyter Notebook pour pratiquer.

Parfois, vous devrez peut-être attendre quelques secondes pour que Jupyter Notebook ait fini de charger. La validation des opérations ne peut pas être automatisée en raison des limitations de Jupyter Notebook.

Si vous rencontrez des problèmes pendant l'apprentissage, n'hésitez pas à demander à Labby. Donnez votre feedback après la session, et nous résoudrons rapidement le problème pour vous.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/DataPreprocessingandFeatureEngineeringGroup(["Data Preprocessing and Feature Engineering"]) 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{{"Sélection de modèle pour la régression Lasso"}} sklearn/preprocessing -.-> lab-49192{{"Sélection de modèle pour la régression Lasso"}} sklearn/pipeline -.-> lab-49192{{"Sélection de modèle pour la régression Lasso"}} sklearn/datasets -.-> lab-49192{{"Sélection de modèle pour la régression Lasso"}} ml/sklearn -.-> lab-49192{{"Sélection de modèle pour la régression Lasso"}} end

Dataset

Tout d'abord, nous allons charger le jeu de données sur le diabète à l'aide de la fonction load_diabetes de sklearn.datasets. Le jeu de données est composé de 10 variables de base, l'âge, le sexe, l'indice de masse corporelle, la pression artérielle moyenne et six mesures de sérum sanguin, et une mesure quantitative de la progression de la maladie un an après le stade initial.

from sklearn.datasets import load_diabetes

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

Ajout de fonctionnalités aléatoires

Nous allons ajouter quelques fonctionnalités aléatoires aux données d'origine pour mieux illustrer la sélection de fonctionnalités effectuée par le modèle Lasso. Les fonctionnalités aléatoires seront générées à l'aide de la fonction RandomState de 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()

Sélection de Lasso via un critère d'information

Nous utiliserons la fonction LassoLarsIC de sklearn.linear_model pour fournir un estimateur Lasso qui utilise le critère d'information d'Akaike (AIC) ou le critère d'information de Bayes (BIC) pour sélectionner la valeur optimale du paramètre de régularisation alpha. Nous allons tout d'abord ajuster un modèle Lasso avec le critère 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

Stockage des résultats et vérification de l'alpha optimal

Nous allons stocker la métrique AIC pour chaque valeur d'alpha utilisée lors de l'ajustement (fit). Nous effectuerons ensuite la même analyse en utilisant le critère BIC. Enfin, nous vérifierons quelle valeur d'alpha conduit au minimum AIC et 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)

Traçage des valeurs AIC et BIC

Enfin, nous allons tracer les valeurs AIC et BIC pour les différentes valeurs d'alpha. Les lignes verticales dans le tracé correspondent à l'alpha choisi pour chaque critère. L'alpha sélectionné correspond au minimum du critère AIC ou 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)"
)

Sélection de Lasso via la validation croisée

Nous utiliserons deux estimateurs différents pour sélectionner le meilleur hyperparamètre alpha avec une validation croisée intégrée : LassoCV et LassoLarsCV. Pour les deux algorithmes, nous utiliserons une stratégie de validation croisée en 20 plis.

Lasso via la descente coordonnée

Nous ferons l'ajustement des hyperparamètres à l'aide de 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 via la régression à angle minimum

Nous ferons l'ajustement des hyperparamètres à l'aide de 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

Sommaire de l'approche de validation croisée

Les deux algorithmes donnent approximativement les mêmes résultats. Lars calcule une solution pour chaque point de rupture du chemin. En conséquence, il est très efficace lorsqu'il y a peu de points de rupture, ce qui est le cas s'il y a peu de caractéristiques ou d'échantillons. En revanche, la descente coordonnée calcule les points du chemin sur une grille prédéfinie (ici, nous utilisons la valeur par défaut). Ainsi, elle est plus efficace si le nombre de points de grille est inférieur au nombre de points de rupture du chemin. Une telle stratégie peut être intéressante si le nombre de caractéristiques est vraiment élevé et s'il y a suffisamment d'échantillons à sélectionner dans chaque plissement de la validation croisée. En termes d'erreurs numériques, pour des variables fortement corrélées, Lars accumulera plus d'erreurs, tandis que l'algorithme de descente coordonnée ne fera que prendre des échantillons sur la grille du chemin.

Sommaire

Dans ce laboratoire, nous avons appris à sélectionner le meilleur hyperparamètre alpha pour les modèles de régression Lasso. Nous avons discuté de deux approches : (1) sélectionner la valeur optimale d'alpha en utilisant uniquement l'ensemble d'entraînement et certains critères d'information, et (2) sélectionner le meilleur hyperparamètre en utilisant la validation croisée. Nous avons utilisé l'ensemble de données du diabète dans cet exemple. Les deux approches peuvent fonctionner de manière similaire, mais la sélection d'hyperparamètres dans l'échantillon montre son efficacité en termes de performance de calcul. Cependant, elle ne peut être utilisée que lorsque le nombre d'échantillons est suffisamment grand par rapport au nombre de caractéristiques. L'optimisation d'hyperparamètres via la validation croisée est une stratégie sûre qui fonctionne dans différents contextes.