La régression : prédire un nombre
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)
test_size=0.25: un quart des données pour le test ;random_state=0: fixe le tirage au sort (comme la graine du module de maths), pour que le résultat soit reproductible.
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
modelesur le jeu d'entraînement ; pred: ses prédictions sur le jeu de test ;maeetr2: 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