Aller au contenu
English

Comprendre la régression

  • Leçon 11
  • 60 min
  • Module 4 : Créer les premiers modèles
Leçon 11 sur 27 · Apprentissage automatique : du problème à un modèle fiableComprendre la régression

Ce que vous saurez faire

Prédisez un nombre, comme le nombre de billets demain, avec un modèle en ligne droite. Vérifiez ensuite s’il fonctionne encore sur des jours jamais vus, avant que quelqu’un l’utilise pour planifier.

Carnet JupyterFaites cette leçon dans un carnet JupyterColab · Kaggle · GitHub · en anglais

Le carnet (notebook) Jupyter contient tout le code, les tâches et les vérifications de cette leçon, avec les instructions. Ses cellules de préparation installent pandas et scikit-learn et téléchargent les données d’exercice. Aucune préparation locale n’est donc nécessaire. Lisez les explications et les graphiques ici, puis exécutez le code dans le carnet.

Le carnet est en anglais. Colab et Kaggle ouvrent votre propre copie. Il faut un compte Google ou Kaggle gratuit. Vous êtes bloqué ? Consultez le carnet de solution.

Avant de commencerCe qu’il faut savoir et avoir sous la mainEnviron 60 minutes

Ce que vous devez savoir

Ce qu’il vous faut sur votre ordinateur (seulement pour travailler localement; le carnet n’a besoin de rien de tout cela)

  • Le dossier du projet ~/projects/ticket-model, avec son environnement .venv (pandas 3.0.6, scikit-learn 1.9.1, matplotlib 3.11.2) et les données dans data/. Vous les avez créés dans Définir une référence de base : préparer votre projet.
  • data/daily_tickets.csv (730 jours). S’il manque ou a changé, exécutez python get_data.py --reset dans le dossier du projet. Si get_data.py manque aussi, téléchargez-le à nouveau : curl -fsSL -O https://raw.githubusercontent.com/Nextia-Intelligence/nextia-learning-labs/main/C05/get_data.py (curl.exe sous Windows).
  • Exécutez le code de cette leçon dans son carnet, ouvert dans VS Code avec le noyau .venv (voir l’encadré après l’exercice guidé).

Testé sous macOS avec Python 3.14.6, pandas 3.0.6, scikit-learn 1.9.1 et matplotlib 3.11.2. Les étapes pour Windows et Linux n’ont pas été testées. Le carnet a été testé dans Jupyter.

Imaginez un taxi en ville. La liste des prix sur la porte indique : 3 $ au départ, puis 2 $ par kilomètre. Un trajet de 5 km coûte donc 3 + 2 × 5 = 13 $, et un trajet de 10 km coûte 23 $. Chaque kilomètre supplémentaire ajoute les mêmes 2 $. Si vous tracez le prix en fonction de la distance, vous obtenez une droite. Elle commence à 3 $ pour 0 km et monte de 2 $ par kilomètre.

Maintenant, inversez la situation. Vous n’avez pas la liste des prix. Vous avez seulement six reçus de trajets précédents :

Distance (km) 2 3 5 6 8 10
Prix ($) 7,50 8,50 12,50 15,50 19,00 23,00

Pouvez-vous trouver le prix de départ et le prix par kilomètre à partir de ces reçus? Les points ne sont pas exactement sur une même droite, car certains trajets attendent dans la circulation, d’autres non. Mais ils sont proches d’une droite. Vous pouvez donc tracer celle qui passe le plus près des six points. Sa hauteur à 0 km est le prix de départ. Sa montée par kilomètre est le prix par kilomètre.

Six reçus de taxi et la droite qui passe le plus près d'eux. La droite commence à 3 $ pour 0 km et monte de 2 $ par kilomètre.
Description textuelle du graphique

Six points représentent les reçus : 2 km pour 7,50 $, 3 km pour 8,50 $, 5 km pour 12,50 $, 6 km pour 15,50 $, 8 km pour 19,00 $ et 10 km pour 23,00 $. Une droite va de 3 $ à 0 km jusqu’à 27 $ à 12 km. Quatre points sont à 50 cents au-dessus ou au-dessous de la droite. Les deux derniers sont exactement dessus.

C’est toute l’idée de cette leçon. Une régression linéaire est un modèle qui prédit un nombre avec une droite. La droite correspond à une valeur de départ plus une quantité fixe pour chaque unité d’une caractéristique. Apprendre le modèle consiste à trouver ces deux nombres à partir d’exemples, comme vous venez de le faire avec les reçus. La valeur de départ est l’ordonnée à l’origine (a), soit la prédiction quand la caractéristique vaut 0. La quantité par unité est le coefficient (b), aussi appelé la pente. La prédiction est a + b × feature.

Le nom a deux parties. « Linéaire » signifie « en ligne droite ». « Régression » désigne un modèle qui prédit un nombre, comme vous l’avez vu dans L’apprentissage supervisé.

Omar, le gestionnaire de produit, planifie les quarts des agents la veille, comme dans Traduire un besoin. S’il prévoit trop peu d’agents, les clients attendent pendant des heures. S’il en prévoit trop, les agents restent sans travail et Larkfield en paie le coût. Il demande donc à Priya : « Combien de billets de soutien arriveront demain? » La réponse est un nombre. Il s’agit donc d’une tâche de régression.

Dans Les métriques de régression, vous avez évalué des prévisions simples sans modèle, comme « prédire la moyenne des jours d’entraînement ». Une telle prévision donne le même nombre pour chaque jour. Mais Omar en sait plus sur demain : est-ce la fin de semaine? Quel mois est-ce? Une régression linéaire peut utiliser ces faits. Elle fonctionne comme le prix du taxi : un nombre de billets de départ, plus une quantité fixe pour chaque fait concernant le jour.

Les données sont dans un deuxième petit fichier de l’exportation complète : daily_tickets.csv, une ligne par jour de juillet 2024 à juin 2026. Les données sont inventées pour ce cours; elles ne contiennent aucune personne réelle. Le modèle de transfert à un niveau supérieur commence dans la prochaine leçon. La régression vient d’abord parce que ses erreurs sont faciles à voir : ce sont des billets.

Commencez simplement, avec une semaine de données réelles : du 1er au 7 juillet 2024. La colonne is_weekend vaut 1 le samedi et le dimanche, et 0 les autres jours. La colonne tickets est le nombre de billets arrivés ce jour-là.

Jour Lun Mar Mer Jeu Ven Sam Dim
is_weekend 0 0 0 0 0 1 1
tickets 33 33 29 36 29 13 9

Voici deux modèles pour cette semaine :

  • Constante : prédire la moyenne de la semaine chaque jour : 182 ÷ 7 = 26 billets.
  • Droite : prédire tickets = a + b × is_weekend, avec a = 32 et b = −21. Un jour de semaine reçoit 32 billets. Un jour de fin de semaine reçoit 32 − 21 = 11.

Lisez la droite comme le prix du taxi. L’ordonnée à l’origine, 32, est la prédiction pour un jour de semaine normal. Le coefficient, −21, est ce qu’ajoute la fin de semaine : ici, il retire 21 billets. Comme is_weekend vaut seulement 0 ou 1, « par unité » signifie « pour un jour de fin de semaine ».

Pour comparer les deux modèles, regardez le résidu de chaque jour : la valeur réelle moins la valeur prédite. C’est l’erreur d’une prédiction, comme dans Les métriques de régression. Les statisticiens l’appellent un résidu parce que c’est ce qui reste après la prédiction. Un résidu positif signifie que le modèle a prédit trop peu; un résidu négatif, trop. La perte est un nombre qui mesure l’erreur du modèle sur l’ensemble des jours. Ici, c’est l’erreur quadratique moyenne (MSE) : mettez chaque résidu au carré, puis prenez la moyenne, comme dans le cours de mathématiques.

Jour Réel Constante Résidu Au carré Droite Résidu Au carré
Lun 33 26 7 49 32 1 1
Mar 33 26 7 49 32 1 1
Mer 29 26 3 9 32 −3 9
Jeu 36 26 10 100 32 4 16
Ven 29 26 3 9 32 −3 9
Sam 13 26 −13 169 11 2 4
Dim 9 26 −17 289 11 −2 4
Somme 674 Somme 44

La MSE de la constante est 674 ÷ 7 = 96,29. La MSE de la droite est 44 ÷ 7 = 6,29. La droite est beaucoup plus proche, parce que la fin de semaine est calme et qu’elle en tient compte. En formule :

MSE=1n∑i=1n(yi−y^i)2\text{MSE} = \frac{1}{n} \sum_{i=1}^{n} \left( y_i - \hat{y}_i \right)^2

Lisez ceci comme « la moyenne, sur les n jours, du résidu au carré ». Ici, y est le nombre réel et ŷ (« y chapeau ») est le nombre prédit.

  • Billets réels
  • Droite : 32 − 21 × is_weekend
Une semaine de billets et le modèle en ligne droite. L'écart vertical entre les deux points d'un jour est son résidu.
Description textuelle du graphique

L’axe horizontal montre les jours du lundi 1er juillet au dimanche 7 juillet 2024. Les nombres réels de billets sont 33, 33, 29, 36 et 29 en semaine, puis 13 et 9 la fin de semaine. Le modèle en ligne droite prédit 32 chaque jour de semaine et 11 chaque jour de fin de semaine. Le plus grand écart est jeudi : 36 billets réels contre 32 prédits, soit un résidu de 4.

Pourquoi a = 32 et b = −21, plutôt qu’une autre paire? La règle est celle des moindres carrés : choisir a et b pour rendre la MSE aussi petite que possible. La mise au carré fait compter chaque résidu, peu importe son signe. Elle donne aussi beaucoup plus de poids à une grande erreur qu’à une petite.

Pour une caractéristique qui vaut seulement 0 ou 1, la réponse est facile à voir. Le meilleur a est la moyenne des jours de semaine : 160 ÷ 5 = 32. Le meilleur a + b est la moyenne des jours de fin de semaine : 22 ÷ 2 = 11, donc b = 11 − 32 = −21. Toute autre droite a une MSE plus grande sur cette semaine. Dans le carnet, vous calculez la MSE d’une autre droite, 33 − 22 × is_weekend, puis vous comparez.

Les reçus de taxi fonctionnent de la même façon. Les moindres carrés trouvent fare = 3.00 + 2.00 × km : la liste des prix. En effet, les retards de circulation se compensent dans ces six reçus. Une autre droite, 4 + 1.8 × km, a une MSE de 0,49 sur les reçus, contre 0,17 pour la meilleure droite.

Ajuster un modèle signifie trouver ses nombres à partir des données. Vous n’avez pas besoin de le faire à la main. LinearRegression de scikit-learn applique les moindres carrés pour vous :

import pandas as pd
from sklearn.linear_model import LinearRegression
daily = pd.read_csv("data/daily_tickets.csv", parse_dates=["date"])
week = daily.head(7)[["date", "weekday", "is_weekend", "tickets"]]
model = LinearRegression()
model.fit(week[["is_weekend"]], week["tickets"])
print("a (intercept_):", round(model.intercept_, 2))
print("b (coef_):", model.coef_.round(2))
print("predictions:", model.predict(week[["is_weekend"]]).round(2))

La sortie :

Sortie
a (intercept_): 32.0
b (coef_): [-21.]
predictions: [32. 32. 32. 32. 32. 11. 11.]

fit (ajuster) reçoit les caractéristiques sous forme de tableau (week[["is_weekend"]], avec deux paires de crochets), même s’il n’y en a qu’une. Il reçoit la cible sous forme d’une colonne (week["tickets"]). Après fit, les nombres appris sont dans intercept_ (ordonnée à l’origine) et coef_ (coefficients). predict (prédire) les utilise pour faire des prédictions.

Exemple détaillé : la prévision de Priya pour mai et juin

Section intitulée « Exemple détaillé : la prévision de Priya pour mai et juin »

Priya utilise maintenant les 730 jours. Elle entraîne le modèle sur les jours avant le 1er mai 2026. Elle le teste sur mai et juin 2026, la saison chargée du jardinage. C’est une séparation chronologique, comme dans Données d’entraînement, de validation et de test. Le modèle prédit toujours des jours qui suivent ceux dont il a appris, comme il le fera en utilisation réelle.

Le mois est un nombre de 1 à 12, mais le mois 12 n’est pas « douze fois » le mois 1. Elle le transforme donc en douze colonnes de 0 et de 1, une par mois (month_1 … month_12). Chaque mois reçoit alors son propre coefficient, comme un supplément distinct. C’est sûr ici, parce que les douze mois sont fixes et connus à l’avance. (Les catégories de billets sont différentes : Prétraiter avec un pipeline explique pourquoi.)

daily = daily.join(pd.get_dummies(daily["month"], prefix="month", dtype=int))
MONTHS = [f"month_{m}" for m in range(1, 13)]
train = daily[daily["date"] < "2026-05-01"].copy()
test = daily[daily["date"] >= "2026-05-01"].copy()
print(len(train), "train days,", len(test), "test days")
print("mean tickets per day in train:", round(train["tickets"].mean(), 2))

La sortie :

Sortie
669 train days, 61 test days
mean tickets per day in train: 25.32

Elle mesure chaque modèle avec les métriques de Les métriques de régression, sur les données d’entraînement et de test. La MAE est la taille moyenne d’une erreur, en billets. La RMSE est aussi en billets, et elle augmente davantage quand certaines erreurs sont grandes. Le résidu moyen sur les données de test est l’erreur moyenne sur ces données. Une valeur positive signifie que le modèle prédit trop peu en moyenne. La fonction report affiche les trois :

from sklearn.metrics import mean_absolute_error, mean_squared_error
def report(name, train_predicted, test_predicted):
"""Print MAE and RMSE on train and test, and the mean test residual."""
parts = []
for part, predicted in [(train, train_predicted), (test, test_predicted)]:
mae = mean_absolute_error(part["tickets"], predicted)
rmse = mean_squared_error(part["tickets"], predicted) ** 0.5
parts.append(f"MAE {mae:.2f}, RMSE {rmse:.2f}")
residual = (test["tickets"] - test_predicted).mean()
print(f"{name}: train {parts[0]} | test {parts[1]} | mean test residual {residual:+.2f}")

Elle compare trois modèles. Le premier est la référence de base sans modèle : prédire la moyenne d’entraînement, 25,32, chaque jour. Le deuxième est la droite de fin de semaine. Le troisième est cette droite plus les douze colonnes des mois.

train_mean = train["tickets"].mean()
report("constant", [train_mean] * len(train), [train_mean] * len(test))
weekend = LinearRegression().fit(train[["is_weekend"]], train["tickets"])
print(f"tickets = {weekend.intercept_:.2f} + ({weekend.coef_[0]:.2f}) x is_weekend")
report("is_weekend", weekend.predict(train[["is_weekend"]]), weekend.predict(test[["is_weekend"]]))
COLUMNS = ["is_weekend"] + MONTHS
season = LinearRegression().fit(train[COLUMNS], train["tickets"])
train["predicted"] = season.predict(train[COLUMNS])
test["predicted"] = season.predict(test[COLUMNS])
report("is_weekend + month", train["predicted"], test["predicted"])

La sortie :

Sortie
constant: train MAE 8.52, RMSE 10.43 | test MAE 14.95, RMSE 17.27 | mean test residual +12.27
tickets = 29.99 + (-16.45) x is_weekend
is_weekend: train MAE 5.86, RMSE 7.33 | test MAE 12.54, RMSE 14.08 | mean test residual +12.45
is_weekend + month: train MAE 4.41, RMSE 5.64 | test MAE 6.45, RMSE 8.19 | mean test residual +4.98

Les mêmes résultats dans un tableau :

Modèle MAE d’entraînement RMSE d’entraînement MAE de test RMSE de test Résidu moyen sur les données de test
Constante (moyenne d’entraînement) 8,52 10,43 14,95 17,27 +12,27
is_weekend 5,86 7,33 12,54 14,08 +12,45
is_weekend + mois 4,41 5,64 6,45 8,19 +4,98

Lisez le tableau de haut en bas :

  • La constante se trompe d’environ 15 billets par jour en mai et juin. Ces mois sont chargés, et la constante prédit trop peu.
  • La droite de fin de semaine, tickets = 29.99 − 16.45 × is_weekend, aide sur les données d’entraînement (5,86), mais pas sur celles de test (12,54). Elle connaît la fin de semaine, mais rien de la saison.
  • Le modèle saisonnier réduit la MAE de test à 6,45, soit moins de la moitié de l’erreur de la constante. Mais son résidu moyen sur les données de test reste à +4,98 : il prédit environ 5 billets de moins par jour.

Un modèle s’ajuste aux jours d’entraînement quand son erreur sur ces jours est petite. Il généralise quand son erreur reste petite sur des jours jamais vus. Le modèle saisonnier s’ajuste mieux qu’il ne généralise : sa MAE d’entraînement est 4,41 et sa MAE de test est 6,45. Ces deux nombres indiquent qu’il manque quelque chose, mais pas quoi. Les résidus, tracés au fil du temps, le montrent.

  • Billets réels
  • Modèle, ajusté sur les données d'entraînement
  • Modèle, prédictions sur les données de test
Les quatre derniers mois : les billets réels et le modèle saisonnier. À partir du 1er mai, la courbe réelle est au-dessus du modèle la plupart des jours.
Description textuelle du graphique

Le graphique montre chaque jour du 1er mars au 30 juin 2026. La courbe réelle monte et descend chaque semaine : cinq jours de semaine chargés, puis deux jours de fin de semaine calmes. Le modèle suit la même forme hebdomadaire, avec un niveau pour chaque mois. En mars et avril (entraînement), la courbe réelle est parfois au-dessus et parfois au-dessous du modèle. En mai et juin (test), elle est au-dessus du modèle la plupart des jours. Le résidu moyen est +5,24 en mai et +4,72 en juin.

Le résidu moyen de chaque mois rend la tendance claire :

  • Résidu moyen par mois
  • Aucune erreur (0)
Le résidu moyen de chaque mois pour le modèle saisonnier. La première année est sous zéro, la deuxième au-dessus, et les deux mois de test sont les plus élevés.
Description textuelle du graphique

Chaque point représente un mois, de juillet 2024 à juin 2026. De juillet 2024 à avril 2025, chaque mois est sous zéro, entre −1,47 et −3,18 : le modèle prédit trop. Mai et juin 2025 sont exactement à 0. De juillet 2025 à avril 2026, chaque mois est au-dessus de zéro, entre +1,47 et +3,08 : le modèle prédit trop peu. Les deux mois de test, mai et juin 2026, sont les plus élevés : +5,24 et +4,72.

La deuxième année est plus chargée que la première, parce que Larkfield a plus de clients chaque mois. Mais le modèle donne le même niveau à tous les mois de juillet. Il prédit donc trop de billets la première année et trop peu la deuxième. Mai et juin 2025 sont exacts parce que les données d’entraînement contiennent un seul mai et un seul juin. Le modèle les reproduit. Ensuite, il prédit mai 2026 à partir de mai 2025, et la boutique a grandi depuis. Aucune colonne ne représente le « temps ». Le modèle ne peut donc pas voir la croissance.

C’est la leçon principale des résidus : une tendance dans les résidus révèle quelque chose que le modèle ne connaît pas. Des résidus qui varient au hasard autour de zéro sont un bon signe. Un résidu qui reste d’un côté pendant des mois indique une caractéristique manquante.

Comparez maintenant le modèle à une prévision sans modèle de Les métriques de régression : « la moyenne du même jour de la semaine sur les 4 dernières semaines ». Sur mai et juin, elle a une MAE de 5,08 et une erreur moyenne de +1,65. Le modèle saisonnier a 6,45 et +4,98. La prévision simple gagne donc. Elle gagne parce que les 4 dernières semaines contiennent déjà la croissance que le modèle ne peut pas voir. Ce n’est pas un échec de l’apprentissage automatique. C’est pourquoi vous comparez chaque modèle à des prévisions simples : un modèle vaut son coût seulement s’il les dépasse. Dans la variante autonome ci-dessous, une caractéristique de tendance amène le modèle à une MAE de 5,01. C’est à peu près la même que celle de la prévision simple.

Une régression linéaire suppose que chaque caractéristique ajoute une quantité fixe, partout la même, comme les 2 $ par kilomètre. Quand cette hypothèse est à peu près vraie, c’est un très bon premier modèle. Il apprend avec peu de données et s’entraîne en une fraction de seconde. Chaque coefficient a un sens clair dans l’unité de la cible : « une journée de fin de semaine compte environ 16 billets de moins ». Omar peut comparer ce nombre à ce qu’il connaît. Tout modèle plus complexe pour les billets quotidiens doit faire mieux.

Cette même hypothèse montre ses limites :

  • Courbes. Si l’effet d’une caractéristique augmente ou diminue selon sa valeur, une droite ne le représente pas. Vous pouvez ajouter des caractéristiques qui la courbent, comme les colonnes des mois l’ont fait.
  • Effets qui dépendent les uns des autres. Si la baisse de fin de semaine est plus forte en été qu’en hiver, un seul coefficient ne suffit pas.
  • Valeurs hors des données. Une droite continue toujours. La droite du taxi indique qu’un trajet de 300 km coûte 3 + 2 × 300 = 603 $. Pourtant, aucun reçu ne dépassait 10 km. Une droite de tendance, que vous ajoutez plus bas, suppose que la croissance continue indéfiniment.
  • Grands écarts. Les moindres carrés élèvent les résidus au carré. Quelques journées extrêmes attirent donc la droite vers elles.

Calculez vous-même le résidu moyen des mois de test. Le carnet Jupyter de la leçon contient toutes les cellules. L’encadré en haut de cette page contient les liens Colab et Kaggle.

  1. Ouvrez le carnet Jupyter dans Colab ou Kaggle.
  2. Exécutez les cellules de préparation. Vous devriez voir pandas 3.0.6, scikit-learn 1.9.1 et la ligne Ready: (prêt).
  3. Dans la section 1, exécutez la cellule du taxi. Vous devriez voir fare = 3.00 + 2.00 x km (tarif = 3,00 + 2,00 × km).
  4. Dans la section 2, prédisez quel modèle a la MSE la plus faible. Exécutez ensuite la cellule. Vous devriez voir MSE constant: 96.29 (MSE de la constante) et MSE line: 6.29 (MSE de la droite).
  5. Faites le premier exercice Your turn (à vous de jouer) : la MSE de 33 − 22 × is_weekend. La cellule de vérification affiche Check passed (vérification réussie) quand votre réponse est bonne.
  6. Dans la section 4, exécutez les trois modèles. Comparez chaque ligne au tableau ci-dessus.
  7. Dans la section 5, faites l’exercice Your turn : le résidu moyen de test pour chaque mois, dans by_month.
  8. Exécutez la cellule suivante. Elle affiche les résidus d’entraînement par mois. Comparez-les au deuxième graphique.
Afficher la réponse à l’étape 7
test["residual"] = test["tickets"] - test["predicted"]
by_month = test["residual"].groupby(test["month"]).mean().round(2)
print(by_month)

Le résultat :

Sortie
month
5 5.24
6 4.72
Name: residual, dtype: float64

Pour les deux mois de test, le modèle prédit environ 5 billets de moins par jour que le nombre réel. En juin, 30 jours × 4,72 donnent environ 140 billets que le plan d’Omar n’avait pas prévus.

Changez une seule chose : ajoutez une colonne days, le nombre de jours depuis le 1er juillet 2024. Elle permet au modèle d’apprendre une croissance régulière, comme un prix qui augmente un peu chaque jour. Avant de l’exécuter, prédisez : le résidu moyen de test va-t-il augmenter, diminuer ou rester près de +5? Dans le carnet Jupyter, ajoutez "days" à trend_columns dans la section 6, puis exécutez la cellule.

Afficher la réponse
daily["days"] = (daily["date"] - pd.Timestamp("2024-07-01")).dt.days
train["days"] = daily.loc[train.index, "days"]
test["days"] = daily.loc[test.index, "days"]
trend_columns = ["is_weekend"] + MONTHS + ["days"]
trend = LinearRegression().fit(train[trend_columns], train["tickets"])
trend_test = trend.predict(test[trend_columns])
report("with trend", trend.predict(train[trend_columns]), trend_test)
print("tickets per day added each day:", round(trend.coef_[trend_columns.index("days")], 4))

Le résultat :

Sortie
with trend: train MAE 4.09, RMSE 5.22 | test MAE 5.01, RMSE 6.52 | mean test residual +0.54
tickets per day added each day: 0.0122

Le résidu moyen de test passe de +4,98 à +0,54, et la MAE de test de 6,45 à 5,01. Le modèle a appris une croissance de 0,0122 billet par jour, chaque jour. Après un an, cela représente environ 4,5 billets de plus par jour (0,0122 × 365). Les résidus mensuels des deux années sont maintenant proches de zéro. Par exemple, ils atteignent −0,96 en juillet 2024 et +0,96 en juillet 2025.

Une tendance présente aussi un risque. Comme la droite du taxi, elle continue : le modèle suppose que la croissance se poursuit au même rythme, indéfiniment. Il ne peut pas prévoir la perte d’un groupe de clients ou l’arrivée d’un nouveau concurrent. Vérifiez ses résidus chaque mois et réentraînez-le quand ils s’éloignent de zéro.

Erreur courante

Des données de test aléatoires cachent la croissance

Symptôme : Tomás, l’ingénieur en IA, choisit au hasard 61 jours comme données de test, plutôt que mai et juin. Le modèle saisonnier semble meilleur :

random_test = daily.sample(n=61, random_state=0)
random_train = daily.drop(random_test.index)
model = LinearRegression().fit(random_train[COLUMNS], random_train["tickets"])
predicted = model.predict(random_test[COLUMNS])
print("random test MAE:", round(mean_absolute_error(random_test["tickets"], predicted), 2))
print("random test mean residual:", round((random_test["tickets"] - predicted).mean(), 2))

Le résultat :

Sortie
random test MAE: 4.38
random test mean residual: -1.1

Une MAE de 4,38 au lieu de 6,45, et presque aucun biais. Omar l’utiliserait pour planifier mai et juin.

Cause : les jours de test aléatoires se trouvent entre des jours d’entraînement des mêmes mois et années. Le modèle a déjà vu leurs voisins, ce qui cache la croissance au fil du temps. En utilisation réelle, le modèle prédit toujours des jours qui suivent ses jours d’entraînement.

Solution : séparez les données selon le temps quand le modèle prédit l’avenir. Entraînez-le sur le passé et testez-le sur les jours suivants. C’est l’approche présentée dans Données d’entraînement, de validation et de test et Choisir une séparation, dans SQL et préparation des données pour l’IA. Examinez ensuite les résidus au fil du temps.

Conséquence dans le travail en IA : un modèle testé sur des lignes aléatoires d’une entreprise en croissance semble exact. Pourtant, il se trompe toujours dans le même sens. Ici, Omar prévoirait environ 5 billets de trop peu par jour, et l’écart augmenterait chaque mois.

Vérifiez votre compréhension

Le modèle saisonnier a un résidu moyen de test de +4,98. Qu'indique le signe à Omar, et comment devrait-il utiliser la prévision?

Afficher la réponse

Un résidu est le nombre réel moins le nombre prédit. Un résidu moyen positif signifie que le modèle prédit trop peu de billets. En moyenne, il arrive environ 5 billets de plus par jour que ce qu’il annonce. Omar ne devrait pas planifier les quarts de travail en suivant exactement la prévision. Pour l’instant, il peut y ajouter environ 5 billets par jour. Mieux encore, Priya ajoute une caractéristique pour la croissance (la tendance) et vérifie à nouveau les résidus.

Vérifiez votre compréhension

Prédisez et expliquez : le modèle saisonnier a une MAE d'entraînement de 4,41 et une MAE de test de 6,45. Pourquoi l'erreur de test est-elle plus grande, et pourquoi le graphique des résidus aide-t-il davantage que les deux nombres?

Afficher la réponse

Les valeurs du modèle viennent des jours d’entraînement, donc il s’y ajuste bien. Les jours de test viennent plus tard, et la boutique a grandi depuis. Le modèle prédit donc trop peu de billets. Les deux valeurs de MAE indiquent seulement que l’erreur de test est plus grande. Le graphique des résidus indique pourquoi. Les résidus restent sous zéro la première année et au-dessus de zéro la deuxième. Ceux des mois de test sont les plus élevés. Un résidu qui reste du même côté au fil du temps indique une caractéristique manquante : le temps ou la croissance de la clientèle.

Vérifiez votre compréhension

La droite d'un taxi est tarif = 3 + 2 × km. Nommez l'ordonnée à l'origine et le coefficient, puis dites ce que chacun signifie. Expliquez pourquoi la droite n'est pas fiable pour un trajet de 300 km.

Afficher la réponse

L’ordonnée à l’origine est 3 : le tarif prédit pour 0 km, soit les frais de départ. Le coefficient est 2 : le tarif augmente de 2 $ pour chaque kilomètre supplémentaire. Pour 300 km, la droite prédit 3 + 2 × 300 = 603 $. Mais les reçus allaient seulement jusqu’à 10 km. Une droite continue dans la même direction. Rien dans les données n’indique que les longs trajets suivent le même tarif. Les vrais longs trajets peuvent avoir un prix fixe ou un tarif différent. Une régression linéaire est fiable seulement près des valeurs à partir desquelles elle a appris.

Récapitulatif

Vous pouvez maintenant prédire un nombre avec une régression linéaire et l’évaluer honnêtement :

  • Une régression linéaire prédit a + b × feature, comme un tarif de taxi. C’est une ordonnée à l’origine (le départ), plus un coefficient pour chaque unité de chaque caractéristique.
  • Un résidu est la valeur réelle moins la valeur prédite. Les moindres carrés choisissent la droite avec l’erreur quadratique moyenne la plus faible; LinearRegression().fit() le fait pour vous.
  • Le modèle saisonnier (is_weekend + mois) atteint une MAE de test de 6,45 et une RMSE de 8,19. La référence de base constante obtient 14,95 et 17,27.
  • Il s’ajuste mieux aux données d’entraînement qu’il ne généralise à mai et juin (MAE de 4,41 contre 6,45). Les résidus montrent pourquoi : la boutique grandit, et aucune caractéristique ne l’indique. Une colonne de tendance réduit le résidu moyen de test de +4,98 à +0,54.
  • Des données de test aléatoires cachent le problème (MAE de 4,38). Séparez les données selon le temps quand le modèle prédit l’avenir.

Ensuite, la question du transfert à un niveau supérieur : un oui ou un non pour chaque billet. Une droite ne peut pas bien y répondre, et la prochaine leçon montre pourquoi.

Leçon suivante : Comprendre la classification