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.
Entraîner et évaluer une régression linéaire
Entraînez une
LinearRegressionsurX_train, y_train, prédisez le test et stockez la MAE dansmaeet le R² dansr2(utilisezsklearn.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 = ...Battre la baseline
Calculez la RMSE de test d’une
DummyRegressor(strategy='mean')(rmse_baseline) et d’uneLinearRegression(rmse_modele), puis le gain relatifgain = 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 = ...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
Quelle métrique pénalise le plus les grosses erreurs ?
- MAE
- RMSE
- R²
- Accuracy
Que vaut le R² d’un modèle qui prédit toujours la moyenne du jeu évalué ?
- 1
- 0
- -1
- 0.5
Où se trouvent les poids appris d’une LinearRegression ?
- reg.weights
- reg.coef_ et reg.intercept_
- reg.params()
- reg.score_
La suite du cours
- Régularisation : Ridge et Lasso15 min
- Classification avec la régression logistique15 min
- Modèles non linéaires : arbres de décision et k plus proches voisins15 min
- Méthodes d'ensemble : forêts aléatoires et gradient boosting20 min