Régression linéaire multiple en Python : modélisation avec plusieurs prédicteurs
La régression linéaire multiple étend la régression simple en intégrant plusieurs variables indépendantes. Le modèle ajuste un hyperplan dans un espace multidimensionnel pour prédire la variable cible Y à partir des prédicteurs X₁ à Xₙ. Chaque coefficient βᵢ reflète l'impact isolé de son facteur respectif tout en maintenant toutes les autres variables constantes. À l'aide du jeu de données Advertising, nous allons prédire les ventes en fonction des budgets publicitaires TV, Radio et Journal.
Formulation mathématique
L'équation du modèle est :
Y = β₀ + β₁X₁ + β₂X₂ + ⋯ + βₙXₙ + ε
β₀ est l'ordonnée à l'origine, βᵢ sont les coefficients de régression, et ε représente les résidus. Les valeurs optimales de β sont calculées par la méthode des moindres carrés ordinaires (OLS) :
β̂ = (XᵀX)⁻¹Xᵀy
Ici, X est la matrice d'attributs étendue (avec une colonne de uns), et y est le vecteur cible. Les hypothèses clés incluent des relations linéaires et une homoscédasticité des résidus.
Préparation des données
Séparez les données en jeux d'entraînement et de test (80/20) pour évaluer les performances de généralisation et éviter le surapprentissage. Appliquez le codage One-Hot pour les variables catégorielles et utilisez StandardScaler pour normaliser les variables numériques — cela améliore l'interprétabilité des coefficients.
Étapes essentielles :
- Vérifiez les valeurs manquantes et les valeurs aberrantes.
- Encodage des variables catégorielles.
- Séparation du jeu de données :
train_test_split(X, y, test_size=0.2, random_state=42). - Normalisation des caractéristiques :
StandardScaler().fit_transform(X_train).
Implémentation sur le jeu de données Advertising
Jeux de données : 200 observations, prédiction des ventes à partir des budgets publicitaires TV, Radio et Journal.
Importation et chargement des données
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score, mean_absolute_error
plt.style.use('seaborn-v0_8-whitegrid')
sns.set_palette("husl")
df = pd.read_csv("Advertising.csv")
if 'Unnamed: 0' in df.columns:
df = df.drop('Unnamed: 0', axis=1)
df.columns = ['TV', 'Radio', 'Newspaper', 'Sales']
print(df.head())
print(f"Taille des données : {df.shape}")
Premières lignes :
| TV | Radio | Newspaper | Sales |
|-------|-------|-----------|-------|
| 230.1 | 37.8 | 69.2 | 22.1 |
| 44.5 | 39.3 | 45.1 | 10.4 |
Analyse exploratoire et corrélation
Statistiques descriptives :
| | TV | Radio | Newspaper | Sales |
|-------|--------|-------|-----------|-------|
| mean | 147.04 | 23.26 | 30.55 | 14.02 |
| std | 85.85 | 14.85 | 21.78 | 5.22 |
Corrélation avec les ventes : TV (0,78), Radio (0,58), Journal (0,23).
Les diagrammes de dispersion révèlent des relations linéaires fortes entre TV-Ventes et Radio-Ventes, mais une liaison faible pour le Journal.
Entraînement du modèle
X = df[['TV', 'Radio', 'Newspaper']]
y = df['Sales']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
model = LinearRegression()
model.fit(X_train, y_train)
print(f"Ordonnée à l'origine : {model.intercept_:.4f}")
for name, coef in zip(X.columns, model.coef_):
print(f"{name} : {coef:.4f}")
Résultats :
- Ordonnée à l'origine : 2,9791
- TV : 0,0447
- Radio : 0,1892
- Journal : 0,0028
Interprétation : Pour chaque augmentation de 1 000 $ dans la publicité TV, les ventes augmentent d’environ 44,7 unités ; la radio génère environ 189,2 unités supplémentaires. Le journal a un impact négligeable.
Évaluation du modèle
y_pred = model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
mae = mean_absolute_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f"MSE : {mse:.2f}, RMSE : {rmse:.2f}, MAE : {mae:.2f}, R² : {r2:.4f}")
Indicateurs :
- MSE : 3,17
- RMSE : 1,78
- MAE : 1,46
- R² : 0,8994
Un R² de 0,90 indique que le modèle explique 90 % de la variance des ventes. Le RMSE et le MAE donnent la taille de l’erreur en unités réelles de ventes.
Diagnostic des résidus
- Histogramme des résidus : symétrique autour de zéro.
- Résidus vs prédictions : pas de motifs visibles (homoscédasticité).
- Diagramme des valeurs réelles vs prévues montre des points regroupés près de la ligne diagonale.
Points clés
- La régression multiple isole les effets des prédicteurs tout en contrôlant les biais.
- Le coefficient presque nul pour le journal suggère qu’il ajoute peu de valeur prédictive.
- Un R² de 0,90 reflète une forte puissance explicative, mais il faut toujours vérifier le VIF pour la multicolinéarité.
- Analysez toujours les résidus pour valider les hypothèses de linéarité et de normalité.
- La normalisation n’est pas obligatoire pour OLS, mais elle améliore l’interprétabilité des coefficients.
— Editorial Team
Aucun commentaire pour le moment.