Combien de vélos sortir pour 20 degrés ?
La météo annonce 20 degrés pour demain. Ce soir, le loueur doit décider combien de vélos sortir du dépôt.
Une année de données montre que les jours chauds sont plus chargés. Une droite tracée à travers ces jours change « plus chargé » en un nombre utile. Elle dit aussi jusqu’où lui faire confiance.
À la fin de cette leçon
Remarque
Je peux ajuster une droite à des données et dire si elle est bonne.
Mots clés
| Mot | Ce que ça veut dire |
|---|---|
| Régression linéaire | une règle en ligne droite qui va d’une valeur à une autre |
| Pente | de combien la réponse change quand l’entrée monte de 1 |
| Ordonnée à l’origine | la réponse quand l’entrée vaut 0 |
| Résidu | la vraie valeur moins la valeur prédite |
| Moindres carrés | le choix de la droite au plus petit total de résidus au carré |
| R carré | la part des variations que la droite explique, de 0 à 1 |
| Jeu de test | des lignes gardées de côté pour juger un modèle |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une droite, c’est une pente et une ordonnée
Une droite s’écrit locations = ordonnee + pente * temperature. La pente dit combien de locations chaque degré de plus apporte. L’ordonnée à l’origine est ce que prédit la droite à 0 degré.
LinearRegression de scikit-learn trouve les deux à partir des données. line.py ajuste les locations à la seule température, sur les 365 jours.
Ajuster les locations à la température
docker exec jupyter python3 steps/line.pyAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Les moindres carrés choisissent la droite
Chaque jour se place un peu au-dessus ou au-dessous de la droite. Cet écart est le résidu. On élève chaque résidu au carré : un écart en dessous compte autant qu’un écart au-dessus. Puis on additionne.
La droite des moindres carrés est celle dont ce total est le plus petit. Deux sommes courtes la donnent : la pente vient de la façon dont x et y varient ensemble, l’ordonnée des moyennes.
Exemple travaillé : trois jours et leurs résidus
| Température | Locations | La droite 130 + 13,75 x | Résidu | Au carré |
|---|---|---|---|---|
| 4 | 180 | 185 | -5 | 25 |
| 8 | 250 | 240 | 10 | 100 |
| 12 | 290 | 295 | -5 | 25 |
| Total | 0 | 150 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Les deux sommes à la main
# Les moindres carrés à la main, pour trois jours.
temperatures = [4, 8, 12]
locations = [180, 250, 290]
moyenne_x = sum(temperatures) / len(temperatures)
moyenne_y = sum(locations) / len(locations)
haut = 0
bas = 0
for n in range(len(temperatures)):
haut = haut + (temperatures[n] - moyenne_x) * (locations[n] - moyenne_y)
bas = bas + (temperatures[n] - moyenne_x) ** 2
pente = haut / bas
ordonnee = moyenne_y - pente * moyenne_x
print("pente :", pente, "ordonnée à l'origine :", ordonnee)
# Changez 290 en 320, puis relancez.
# La pente monte-t-elle ou descend-elle ?
À taper dans votre carnet : toute l’année
import pandas as pd
locations = pd.read_csv("hires.csv")
x = locations["temp_c"]
y = locations["hires"]
pente = ((x - x.mean()) * (y - y.mean())).sum() / ((x - x.mean()) ** 2).sum()
ordonnee = y.mean() - pente * x.mean()
# À comparer avec ce que line.py a affiché.
round(pente, 1), round(ordonnee, 1)
Juger une droite sur des jours inconnus
Une droite colle toujours assez bien aux jours dont elle a appris. La vraie question : que donne-t-elle sur des jours nouveaux ?
On coupe donc les données. On ajuste sur environ trois quarts, le jeu d’entraînement, et on garde le reste comme jeu de test. On mesure ensuite R carré et l’erreur moyenne sur le jeu de test seul.
Apprendre sur des jours, tester sur d’autres
docker exec jupyter python3 steps/split.pyAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Une erreur fréquente
Attention
Beaucoup pensent qu’un R carré élevé sur les données apprises prouve qu’un modèle prédira bien. Un modèle est toujours flatté par ce qu’il a déjà vu. Jugez-le sur un jeu de test qu’il n’a jamais vu, et citez ce chiffre-là.
À taper dans votre carnet : l’erreur sur l’appris
# La droite apprise sur les 365 jours, jugée sur ces mêmes jours.
residus = y - (ordonnee + pente * x)
round(residus.abs().mean(), 1)
Plus d’entrées peuvent expliquer plus
La température seule explique environ 60 % des variations d’un jour à l’autre. La pluie compte aussi.
model.py ajuste une seule droite à deux entrées, la température et la pluie. Chaque entrée reçoit sa propre pente. Une pente négative veut dire que l’entrée tire la réponse vers le bas.
Ajuster avec la température et la pluie
docker exec jupyter python3 steps/model.pyAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Pour aller plus loin
Dans votre carnet, ajoutez une troisième entrée : une colonne week-end de 1 et de 0, faite avec locations["weekday"].isin(["Sat", "Sun"]).astype(int).
Ajustez sur un jeu d’entraînement et notez sur un jeu de test, comme split.py. Le R carré de test monte-t-il ? Dites en une phrase ce que la pente du week-end signifie pour le loueur.