Régression linéaire et métriques de régression

Première leçon du cours Apprentissage supervisé : régression et classification, en accès libre : environ 15 minutes, 3 exercices et 3 questions de quiz. C'est la leçon de base du catalogue ; dans l'espace étudiant, elle est réécrite pour ton profil.

Objectifs

  • Entraîner une régression linéaire et lire ses coefficients
  • Calculer et interpréter MAE, RMSE et R²
  • Comparer un modèle à une baseline naïve

Régression linéaireMAE, RMSE, R²Baseline

La régression consiste à prédire une valeur numérique : un prix, une durée, une consommation. Le modèle le plus simple, et souvent un excellent point de départ, est la régression linéaire :

ŷ = b + w₁·x₁ + w₂·x₂ + … + wₚ·xₚ

Chaque feature xⱼ reçoit un poids wⱼ, et b est l’ordonnée à l’origine. L’entraînement cherche les poids qui minimisent la somme des carrés des erreurs (moindres carrés ordinaires).

Entraîner et lire le modèle

Le jeu intégré load_diabetes décrit 442 patients par 10 mesures (âge, IMC, pression artérielle…) déjà centrées et mises à l’échelle. La cible est un indicateur de progression de la maladie un an plus tard.

from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression

X, y = load_diabetes(return_X_y=True, as_frame=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)

reg = LinearRegression().fit(X_train, y_train)
print(reg.intercept_)                                   # constante b
print(dict(zip(X.columns, reg.coef_.round(1))))         # un poids par feature

Un coefficient positif signifie qu’à autres variables constantes, la cible augmente quand la feature augmente. Comparer les coefficients entre eux n’a de sens que si les features sont à la même échelle, ce qui est le cas ici.

Mesurer l’erreur

from sklearn.metrics import mean_absolute_error, root_mean_squared_error, r2_score

y_pred = reg.predict(X_test)
print("MAE :", mean_absolute_error(y_test, y_pred))      # environ 45
print("RMSE:", root_mean_squared_error(y_test, y_pred))  # environ 56
print("R²  :", r2_score(y_test, y_pred))                 # environ 0.36
  • MAE (erreur absolue moyenne) : l’écart moyen, dans l’unité de la cible. Facile à expliquer.
  • RMSE (racine de l’erreur quadratique moyenne) : également dans l’unité de la cible, mais les grosses erreurs pèsent plus lourd. Toujours supérieure ou égale à la MAE.
  • R² : part de la variance de y expliquée par le modèle. 1 = parfait ; 0 = pas mieux que prédire la moyenne ; négatif = pire que la moyenne. C’est la valeur renvoyée par reg.score.

Note : dans les versions récentes de scikit-learn, on utilise root_mean_squared_error ; l’ancien argument squared=False de mean_squared_error a été supprimé.

Toujours comparer à une baseline

Un R² de 0.36 est-il bon ? Pour le savoir, comparez à un modèle naïf :

from sklearn.dummy import DummyRegressor

baseline = DummyRegressor(strategy="mean").fit(X_train, y_train)
print(mean_absolute_error(y_test, baseline.predict(X_test)))   # environ 58

Le modèle linéaire réduit l’erreur moyenne d’environ 58 à 45 : il apporte une information réelle, même si une bonne partie de la variabilité reste inexpliquée. Dans un contexte métier, c’est souvent cette comparaison, exprimée dans l’unité de la cible, qui convainc.

Limites

La régression linéaire suppose une relation additive et linéaire. Si la réalité est courbée ou comporte des interactions, il faudra créer des features adaptées (cours DS5) ou utiliser des modèles non linéaires (leçons 4 et 5). Elle est aussi sensible aux valeurs extrêmes et aux features très corrélées, ce qui nous amène à la régularisation.

Exercices

Les solutions et les tests restent sur le serveur. Dans l'espace étudiant, ton code est exécuté et corrigé, et le tuteur donne des indices avant la solution.

  1. CodeDifficulté 1Python dans le navigateur2 indices

    Entraîner et évaluer une régression linéaire

    Entraînez une LinearRegression sur X_train, y_train, prédisez le test et stockez la MAE dans mae et le R² dans r2 (utilisez sklearn.metrics).

    from sklearn.datasets import load_diabetes
    from sklearn.model_selection import train_test_split
    from sklearn.linear_model import LinearRegression
    from sklearn.metrics import mean_absolute_error, r2_score
    
    X, y = load_diabetes(return_X_y=True)
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
    reg = ...
    mae = ...
    r2 = ...
  2. CodeDifficulté 2Python dans le navigateur2 indices

    Battre la baseline

    Calculez la RMSE de test d’une DummyRegressor(strategy='mean') (rmse_baseline) et d’une LinearRegression (rmse_modele), puis le gain relatif gain = 1 - rmse_modele / rmse_baseline.

    from sklearn.datasets import load_diabetes
    from sklearn.model_selection import train_test_split
    from sklearn.linear_model import LinearRegression
    from sklearn.dummy import DummyRegressor
    from sklearn.metrics import root_mean_squared_error
    
    X, y = load_diabetes(return_X_y=True)
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
    rmse_baseline = ...
    rmse_modele = ...
    gain = ...
  3. QCMDifficulté 21 indice

    Interpréter un R² négatif

    Sur le test, un modèle obtient R² = -0.2. Que peut-on conclure ?

    • Le modèle est parfait
    • Le modèle fait moins bien que prédire la moyenne
    • Il y a une erreur de calcul, R² est toujours positif
    • Le modèle a 20 % d'erreur

Quiz de fin de leçon

  1. Quelle métrique pénalise le plus les grosses erreurs ?

    • MAE
    • RMSE
    • R²
    • Accuracy
  2. Que vaut le R² d’un modèle qui prédit toujours la moyenne du jeu évalué ?

    • 1
    • 0
    • -1
    • 0.5
  3. Où se trouvent les poids appris d’une LinearRegression ?

    • reg.weights
    • reg.coef_ et reg.intercept_
    • reg.params()
    • reg.score_

La suite du cours

  1. Régularisation : Ridge et Lasso15 min
  2. Classification avec la régression logistique15 min
  3. Modèles non linéaires : arbres de décision et k plus proches voisins15 min
  4. Méthodes d'ensemble : forêts aléatoires et gradient boosting20 min

Apprentissage supervisé : régression et classification · Intermédiaire · 2 h 50