Retour à l'accueil

Régression multiple en Python : scikit-learn

L'article traite de la régression linéaire multiple sur le jeu de données Advertising. Décrit les bases mathématiques, la préparation des données, l'entraînement du modèle LinearRegression, les métriques de qualité (R²=0.90) et les diagnostics des résidus.

Construisez la régression multiple : TV, Radio, Ventes
Advertisement 728x90

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ₙ + ε

Google AdInline article slot

β₀ 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.

Google AdInline article slot

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.

Google AdInline article slot

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

Advertisement 728x90

Lire ensuite