ParcoursOuvrir l'appli

La régression : prédire un nombre

Machine learning classique · 55 min

Juger un modèle sur ce qu'il n'a jamais vu

Voici le piège central de tout le machine learning. Si tu entraînes un modèle sur des maisons, puis que tu le testes sur les mêmes maisons, il aura l'air excellent : il a vu les réponses ! Mais ça ne dit rien de sa capacité à prédire le prix d'une nouvelle maison, la seule chose qui compte.

sklearn fait la coupure au hasard :

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)

Mesurer l'erreur d'une régression

Trois mesures reviennent tout le temps pour une régression. On les importe depuis sklearn.metrics.

Exercice : Prédire le prix d'une maison

Le fichier maisons.csv décrit 70 maisons (surface, nombre de chambres, distance au centre, prix). La coupure entraînement/test est déjà faite. À toi :

  • entraîne une régression linéaire modele sur le jeu d'entraînement ;
  • pred : ses prédictions sur le jeu de test ;
  • mae et r2 : l'erreur absolue moyenne et le R² sur le test.
Voir une solution
import pandas as pd
from sklearn.model_selection import train_test_split

df = pd.read_csv("maisons.csv")
X = df[["surface", "chambres", "distance"]]
y = df["prix"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error, r2_score

modele = LinearRegression()
modele.fit(X_train, y_train)
pred = modele.predict(X_test)
mae = mean_absolute_error(y_test, pred)
r2 = r2_score(y_test, pred)
print("MAE :", round(mae), "FCFA")
print("R2 :", round(r2, 3))

Dans l'appli, ton code est exécuté et corrigé automatiquement. Faire l'exercice

Lire ce que le modèle a appris

Un modèle linéaire est interprétable : on peut lire ses coefficients, un par caractéristique.

for nom, coef in zip(X.columns, modele.coef_):
    print(nom, round(coef))
# surface 149602
# chambres 1341789
# distance -245468

Ça se lit directement : chaque m² en plus ajoute environ 150 000 FCFA, chaque chambre environ 1,3 million, et chaque km d'éloignement du centre retire 245 000 FCFA (coefficient négatif). Le modèle a retrouvé tout seul, à partir des seules données, des règles que n'importe quel agent immobilier confirmerait.

Exercice : Ce que vaut chaque mètre carré

Le modèle est entraîné. Construis effets : un dictionnaire qui associe à chaque caractéristique son coefficient arrondi à l'entier. Puis plus_cher : le nom de la caractéristique qui fait le plus monter le prix (le plus grand coefficient).

Voir une solution
import pandas as pd
from sklearn.model_selection import train_test_split

df = pd.read_csv("maisons.csv")
X = df[["surface", "chambres", "distance"]]
y = df["prix"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
from sklearn.linear_model import LinearRegression

modele = LinearRegression().fit(X_train, y_train)

effets = {nom: round(coef) for nom, coef in zip(X.columns, modele.coef_)}
plus_cher = max(effets, key=effets.get)
print(effets)
print(plus_cher)

Dans l'appli, ton code est exécuté et corrigé automatiquement. Faire l'exercice