Apprentissage automatique - Prédiction du prix des maisons
Lorsqu’on achète une maison, on porte généralement un jugement global : emplacement, surface, âge du bien, nombre de pièces, densité de population, conditions de transport, etc. Chaque facteur influence le prix, mais cette influence n’est ni linéaire ni unique ; elle résulte plutôt d’une accumulation, de compromis et d’une concurrence entre les facteurs.
En apprentissage automatique,les problèmes de régressiontransforment, par essence, ce « jugement fondé sur l’expérience » en un modèle mathématique calculable, réutilisable et évaluable.
Ce chapitre partira de zéro et parcourra le pipeline standard complet d’apprentissage automatique deprédiction du prix des maisons: compréhension des données → analyse des caractéristiques → entraînement du modèle → évaluation du modèle → optimisation du modèle. L’objectif n’est pas de mémoriser les API, mais de comprendre ce que fait chaque étape et pourquoi elle est effectuée.
Partie 1 : Préparation du projet et configuration de l’environnement
1.1 Outils principaux utilisés
- NumPy: un outil de calcul numérique de bas niveau qui fournit des opérations efficaces sur les tableaux.
- Pandas: un outil essentiel pour l’analyse de données tabulaires, indispensable aux premières étapes de l’apprentissage automatique.
- Matplotlib / Seaborn: visualisation de données, utilisée pour comprendre les distributions et les relations des données.
- Scikit-learn: une boîte à outils d’apprentissage automatique couvrant les jeux de données, les modèles et les méthodes d’évaluation.
1.2 Installation des dépendances
pip install numpy pandas matplotlib seaborn scikit-learn
Partie 2 : Chargement et compréhension du jeu de données
Les premiers tutoriels utilisaient souvent le jeu de données Boston Housing, mais il a été déprécié. Ici, nous utilisons le jeu de données officiellement recommandéCalifornia Housing, qui a le même concept mais des données plus standardisées.
Exemple : Chargement des données
from sklearn.datasets import fetch_california_housing
# Charger le jeu de données des prix des logements en Californie
data = fetch_california_housing()
# Données de caractéristiques (X)
df_features = pd.DataFrame(
data.data,
columns=data.feature_names
)
# Variable cible (y) : valeur médiane des logements
df_target = pd.DataFrame(
data.target,
columns=['MedHouseVal']
)
print(df_features.head())
print(df_target.head())
Sortie :
MedInc HouseAge AveRooms AveBedrms Population AveOccup Latitude Longitude 0 8.3252 41.0 6.984127 1.023810 322.0 2.555556 37.88 -122.23 1 8.3014 21.0 6.238137 0.971880 2401.0 2.109842 37.86 -122.22 2 7.2574 52.0 8.288136 1.073446 496.0 2.802260 37.85 -122.24 3 5.6431 52.0 5.817352 1.073059 558.0 2.547945 37.85 -122.25 4 3.8462 52.0 6.281853 1.081081 565.0 2.181467 37.85 -122.25 MedHouseVal 0 4.526 1 3.585 2 3.521 3 3.413 4 3.422
À ce stade, vous devez avoir compris trois choses :
- Chaque ligne correspond aux caractéristiques statistiques d'une maison
- Chaque colonne est une variable qui peut être utilisée pour la prédiction
MedHouseValest la cible que nous voulons prédire
Partie 3 : Analyse exploratoire des données (EDA)
Avant d'entraîner le modèle, vous devez d'abord répondre à une question :Les données valent-elles la peine d'être utilisées pour l'apprentissage ?
3.1 Vérification de la structure des données et des valeurs manquantes
Exemple : Aperçu des données
print("Dimensions de la cible :", df_target.shape)
print("\n"Types de données et valeurs manquantes :")
df_features.info()
print("\n"Statistiques des valeurs manquantes :")
print(df_features.isnull().sum())
Conclusion :
- Taille d'échantillon suffisante (environ 20,000 entrées)
- Toutes les caractéristiques sont numériques
- Aucune valeur manquante, on peut directement construire le modèle
3.2 Relation entre une caractéristique unique et le prix des maisons
L'apprentissage automatique n'est pas une boîte noire ; au moins au stade introductif, vous devez savoir ce que le modèle apprend.
Exemple : Relation entre le nombre de pièces et le prix des maisons
plt.figure(figsize=(8, 6))
plt.scatter(df_features['AveRooms'], df_target['MedHouseVal'], alpha=0.4)
plt.xlabel('Nombre moyen de pièces')
plt.ylabel('Valeur médiane des logements')
plt.title('Nombre de pièces vs prix des logements')
plt.grid(True)
plt.show()
Conclusion intuitive : plus il y a de pièces, plus le prix des logements est globalement élevé, mais il y a une dispersion importante. C'est exactement l'objectif d'un modèle de régression.
3.3 Analyse de corrélation des caractéristiques
Exemple : carte de chaleur des corrélations
df_all = pd.concat([df_features, df_target], axis=1)
corr = df_all.corr()
plt.figure(figsize=(10, 8))
sns.heatmap(corr, cmap='coolwarm', center=0)
plt.title('Carte de chaleur des corrélations des caractéristiques')
plt.show()
Le but de cette étape n'est pas de « sélectionner un modèle », mais de confirmer : il existe bien une relation statistique qui peut être apprise.
Partie 4 : Construction du premier modèle de régression
4.1 Séparation de l'ensemble d'entraînement et de l'ensemble de test
Le modèle ne peut pas utiliser le même lot de données à la fois pour apprendre et pour être testé ; sinon, les résultats de l'évaluation n'ont pas de sens.
Exemple : fractionnement du jeu de données
X = df_features
y = df_target['MedHouseVal']
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
print("Ensemble d'entraînement :", X_train.shape)
print("Ensemble de test :", X_test.shape)
4.2 Entraînement d'un modèle de régression linéaire
Exemple : entraînement du modèle
model = LinearRegression()
model.fit(X_train, y_train)
print("Ordonnée à l'origine :", model.intercept_)
print("Coefficients :")
for name, coef in zip(X.columns, model.coef_):
print(f"{name}: {coef:.4f}")
L'avantage de la régression linéaire est :une forte interprétabilité,adaptée à la compréhension de l'essence des problèmes de régression.
Partie 5 : Prédiction et évaluation du modèle
5.1 Comparaison des résultats de prédiction
Exemple : Prédictions vs. Valeurs réelles
result = pd.DataFrame({
"Actual": y_test.values,
"Predicted": y_pred
})
print(result.head())
5.2 Quantification du modèle avec des métriques d'évaluation
Exemple : Métriques d'évaluation
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print("MSE:", mse)
print("R2:", r2)
Explication :
- Plus la MSE est petite, plus l'erreur de prédiction est faible
- Plus R² est proche de 1, plus le pouvoir explicatif du modèle est fort
Partie 6 : Optimisation du modèle – Standardisation et régression Ridge
6.1 Pourquoi standardiser ?
Des différences énormes dans les échelles des caractéristiques conduiront le modèle à privilégier les caractéristiques ayant des valeurs plus élevées.
Exemple : standardisation des caractéristiques
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
6.2 Utilisation de la régression Ridge pour supprimer le surapprentissage
Exemple : régression Ridge
ridge = Ridge(alpha=1.0)
ridge.fit(X_train_scaled, y_train)
y_pred_ridge = ridge.predict(X_test_scaled)
print("Ridge MSE:", mean_squared_error(y_test, y_pred_ridge))
print("Ridge R2:", r2_score(y_test, y_pred_ridge))
Partie 7 : Révision complète du pipeline
