Estimations par régression linéaire et polynômiale

Français

Régression Linéaire

Supposons que nous disposions des chiffres d'affaire bi-mensuel d'une entreprise constatés au cours des 5 derniers mois.

Nous cherchons une bonne estimation du C.A. les mois suivants

La régression linéaire est un modèle prédictif consistant à déterminer l'évolution linéaire "la plus proche" des relevés déjà obtenus, et d'en déduire une prédiction lors des mois à venir.

 

Régression polynômiale

De manière à minimiser l'erreur commise dans la régression linéaire, cherchons à interpoler les valeurs du C.A. par une courbe plus proche de chaque point: ici un modèle polynômial d'ordre 2:

Il est toujours possible de trouver un polynôme interpolant un nombre fini de valeurs.

Il ne sont par contre pas tous de bons prédicateurs s'il s'agit de données temporelles:
voici une interpolation parfaite des 10 premières valeurs constatés par un polynôme de degré 10


et voici ses prédictions, de toute évidence erronnées

alors que voici l'interpolation par un polynôme (moins complexe) de degré 3:

et ses prédictions bien plus réalistes:

Une excellente interpolation des données existantes n'est donc pas gage de prédictions fiables.

Une interpolation linéaire est donc généralement "trop simple" (problème à haut biais)
Une interpolation polynomiale de degré trop élevé est généralement "trop complexe" (problème à haute variance)

Un bon modèle repose donc sur un compromis

 

Ci joint le code python générant les modèles utilisés:

import matplotlib.pyplot as plt import numpy as np from sklearn.linear_model import LinearRegression from sklearn.preprocessing import PolynomialFeatures mu, sigma = 0, 15 # mean and standard deviation s = np.random.normal(mu, sigma, 10) def get_poly(x): return (x-7)**3 + 220 X=[1,2,3,4,5,6,7,8,9,10] Y = [] for index,i in enumerate(X): Y.insert(index,get_poly(i) + s[index]) Xnew = [11,12,13,14,15] Ynew = [] for index,i in enumerate(Xnew): Ynew.insert(index,get_poly(i) + s[index]) #print(index) #Y=[6.9,7,9,15.7,18.5,22,28,34.5,40] plt.scatter(X+Xnew, Y+Ynew, color='navy', s=30, marker='o', label="relevés") #transformation des X despuis lists en tableau numpy de dim (10,1) Xnp = np.array(X).reshape((len(X),1)) Ynp = np.array(Y).reshape((len(Y),1)) Xnpnew = np.array(Xnew).reshape((len(Xnew),1)) Ynpnew = np.array(Ynew).reshape((len(Ynew),1)) polynomial_features= PolynomialFeatures(degree=3) model = LinearRegression() #déformation des features x_poly = polynomial_features.fit_transform(Xnp) x_poly_new = polynomial_features.fit_transform(Xnpnew) model.fit(x_poly , Ynp) #prediction du model polynomial y_pred = model.predict(x_poly) y_new_pred = model.predict(x_poly_new) plt.plot(Xnp, y_pred, linestyle='dashed') plt.plot(Xnpnew, y_new_pred, linestyle='dashed',c='red')