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
1. Comprendre l'apprentissage automatique
2. Cadrer le problème de prédiction
3. Évaluer les modèles supervisés
4. Créer les premiers modèles
5. Essayer d'autres familles de modèles
6. Régler et finaliser le modèle
7. Comprendre et choisir le modèle
8. Préparer la passation du modèle
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 Jupyter
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 main
Ce que vous devez savoir
- Les caractéristiques, les étiquettes et la régression, dans L’apprentissage supervisé : caractéristiques et étiquettes.
- Les données d’entraînement et de test, et pourquoi une séparation chronologique reproduit l’utilisation réelle, dans Données d’entraînement, de validation et de test.
- L’erreur d’une prédiction, la MAE, la RMSE et l’erreur moyenne, dans Les métriques de régression.
- La perte comme erreur quadratique moyenne, dans Perte et gradients : quelle est l’erreur à w = 6? La perte du cours Mathématiques et statistiques essentielles pour l’IA.
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 dansdata/. 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écutezpython get_data.py --resetdans le dossier du projet. Siget_data.pymanque aussi, téléchargez-le à nouveau :curl -fsSL -O https://raw.githubusercontent.com/Nextia-Intelligence/nextia-learning-labs/main/C05/get_data.py(curl.exesous 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.
Le prix d’un trajet en taxi suit une droite
Section intitulée « Le prix d’un trajet en taxi suit une droite »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.
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é.
La question d’Omar : combien de billets demain?
Section intitulée « La question d’Omar : combien de billets demain? »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.
Une droite sur sept jours
Section intitulée « Une droite sur sept jours »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, aveca = 32etb = −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 :
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
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.
Les moindres carrés : comment choisir la droite
Section intitulée « Les moindres carrés : comment choisir la droite »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 pdfrom 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 :
a (intercept_): 32.0b (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 :
669 train days, 61 test daysmean tickets per day in train: 25.32Elle 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"] + MONTHSseason = 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 :
constant: train MAE 8.52, RMSE 10.43 | test MAE 14.95, RMSE 17.27 | mean test residual +12.27tickets = 29.99 + (-16.45) x is_weekendis_weekend: train MAE 5.86, RMSE 7.33 | test MAE 12.54, RMSE 14.08 | mean test residual +12.45is_weekend + month: train MAE 4.41, RMSE 5.64 | test MAE 6.45, RMSE 8.19 | mean test residual +4.98Les 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.
Lire les résidus
Section intitulée « Lire les résidus »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
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)
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.
Quand une droite est le bon outil
Section intitulée « Quand une droite est le bon outil »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.
Exercice guidé : les résidus par mois
Section intitulée « Exercice guidé : les résidus par mois »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.
- Ouvrez le carnet Jupyter dans Colab ou Kaggle.
- Exécutez les cellules de préparation. Vous devriez voir
pandas 3.0.6,scikit-learn 1.9.1et la ligneReady:(prêt). - 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). - 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) etMSE line: 6.29(MSE de la droite). - Faites le premier exercice Your turn (à vous de jouer) : la MSE de
33 − 22 × is_weekend. La cellule de vérification afficheCheck passed(vérification réussie) quand votre réponse est bonne. - Dans la section 4, exécutez les trois modèles. Comparez chaque ligne au tableau ci-dessus.
- Dans la section 5, faites l’exercice Your turn : le résidu moyen de test pour chaque mois, dans
by_month. - 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 :
month5 5.246 4.72Name: residual, dtype: float64Pour 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.
Variante autonome : ajouter une tendance
Section intitulée « Variante autonome : ajouter une tendance »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.daystrain["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 :
with trend: train MAE 4.09, RMSE 5.22 | test MAE 5.01, RMSE 6.52 | mean test residual +0.54tickets per day added each day: 0.0122Le 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 :
random test MAE: 4.38random test mean residual: -1.1Une 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érification des connaissances
Section intitulée « Vérification des connaissances »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.
Votre réponse contient-elle les points principaux de la nôtre ?
Connectez-vous et inscrivez-vous au cours pour enregistrer vos réponses. Chaque vérification compte pour le certificat.
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.
Votre réponse contient-elle les points principaux de la nôtre ?
Connectez-vous et inscrivez-vous au cours pour enregistrer vos réponses. Chaque vérification compte pour le certificat.
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.
Votre réponse contient-elle les points principaux de la nôtre ?
Connectez-vous et inscrivez-vous au cours pour enregistrer vos réponses. Chaque vérification compte pour le certificat.
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