TP Machine Learning – Régression avancée : Prédiction du prix des
maisons
🎯 Objectif : Mettre en œuvre plusieurs modèles de régression, les comparer et optimiser le
meilleur. Ce TP vous fera pratiquer la préparation de données, la comparaison de modèles
et la recherche d’hyperparamètres.
1. Chargement du jeu de données
Le jeu de données utilisé est le California Housing Dataset, disponible directement dans
scikit-learn.
from [Link] import fetch_california_housing
import pandas as pd
data = fetch_california_housing(as_frame=True)
df = [Link]
[Link]()
2. Exploration des données
import seaborn as sns
import [Link] as plt
print([Link]())
print([Link]())
[Link]([Link](), annot=True, cmap="coolwarm")
[Link]()
Questions :
- Quelles sont les variables les plus corrélées avec la variable cible MedHouseVal ?
- Y a-t-il des valeurs extrêmes ou aberrantes ?
3. Séparation des données
from sklearn.model_selection import train_test_split
X = [Link]("MedHouseVal", axis=1)
y = df["MedHouseVal"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
4. Construction d’un pipeline ML
from [Link] import StandardScaler
from [Link] import Pipeline
from sklearn.linear_model import LinearRegression
from [Link] import mean_squared_error
pipe_lr = Pipeline([
("scaler", StandardScaler()),
("model", LinearRegression())
])
pipe_lr.fit(X_train, y_train)
y_pred = pipe_lr.predict(X_test)
rmse = mean_squared_error(y_test, y_pred, squared=False)
print(f"RMSE (régression linéaire) : {rmse:.3f}")
5. Comparaison de plusieurs modèles
from [Link] import RandomForestRegressor, GradientBoostingRegressor
from [Link] import SVR
models = {
"Linear Regression": LinearRegression(),
"Random Forest": RandomForestRegressor(random_state=42),
"Gradient Boosting": GradientBoostingRegressor(random_state=42),
"Support Vector Regressor": SVR()
}
results = {}
for name, model in [Link]():
pipe = Pipeline([
("scaler", StandardScaler()),
("model", model)
])
[Link](X_train, y_train)
y_pred = [Link](X_test)
rmse = mean_squared_error(y_test, y_pred, squared=False)
results[name] = rmse
results_df = [Link].from_dict(results, orient="index",
columns=["RMSE"]).sort_values("RMSE")
print(results_df)
Question : Quel modèle obtient le plus faible RMSE ? Pourquoi, selon toi ?
6. Optimisation d’hyperparamètres (Grid Search)
from sklearn.model_selection import GridSearchCV
params = {
"model__n_estimators": [50, 100, 200],
"model__max_depth": [5, 10, None],
"model__min_samples_split": [2, 5, 10]
}
pipe_rf = Pipeline([
("scaler", StandardScaler()),
("model", RandomForestRegressor(random_state=42))
])
grid = GridSearchCV(pipe_rf, params, cv=3, scoring="neg_root_mean_squared_error",
n_jobs=-1)
[Link](X_train, y_train)
print("Meilleurs paramètres :", grid.best_params_)
print("Meilleur score (RMSE négatif) :", grid.best_score_)
7. Évaluation finale
best_model = grid.best_estimator_
y_pred = best_model.predict(X_test)
rmse = mean_squared_error(y_test, y_pred, squared=False)
print(f"RMSE sur test : {rmse:.3f}")
8. Interprétation et visualisation
import numpy as np
importances = best_model.named_steps["model"].feature_importances_
features = [Link]
[Link](x=importances, y=features)
[Link]("Importance des variables (Random Forest)")
[Link]()
🚀 Extensions possibles
- Tester XGBoost ou LightGBM
- Ajouter des interactions entre variables
- Analyser les résidus du modèle
- Visualiser les performances via un graphique prédictions vs valeurs réelles