ParcoursOuvrir l'appli

Apprendre à partir d'exemples

Machine learning classique · 50 min

Deux façons de résoudre un problème

Pour reconnaître un spam, on peut écrire des règles à la main : « si le message contient gagné, loterie et un lien bizarre, c'est un spam ». Ça marche un temps, puis les spammeurs changent, et on court après eux sans fin.

L'autre façon : montrer à un programme des milliers d'exemples d'e-mails déjà étiquetés « spam » ou « pas spam », et le laisser trouver tout seul les règles. C'est le machine learning.

Tu as fait le gros du travail à la main dans les modules précédents. Maintenant, tu vas utiliser scikit-learn (abrégé sklearn), la grande bibliothèque de machine learning en Python, qui contient des dizaines de modèles prêts à l'emploi, tous pilotés de la même façon.

Le vocabulaire : X, y, entraîner, prédire

On range toujours les données de la même façon.

Les trois gestes de scikit-learn

Tous les modèles de sklearn se pilotent avec les mêmes méthodes :

modele = LinearRegression()      # 1. choisir un modèle
modele.fit(X, y)                 # 2. l'entraîner sur les exemples
modele.predict(X_nouveau)        # 3. prédire sur du nouveau

Le même problème qu'en maths, en trois lignes

Souviens-toi : dans le module de maths, tu as écrit une descente de gradient pour trouver le prix des courses de moto-taxi (a ≈ 123, b ≈ 114). sklearn le fait en trois lignes. La première fois, sklearn se télécharge : patiente quelques secondes.

import numpy as np
from sklearn.linear_model import LinearRegression

distance = np.array([1, 2, 3, 4, 5, 6, 8, 10]).reshape(-1, 1)
prix = np.array([250, 350, 500, 600, 700, 850, 1100, 1350])

modele = LinearRegression()
modele.fit(distance, prix)

print("prix par km :", round(modele.coef_[0], 2))
print("prise en charge :", round(modele.intercept_, 2))
print("course de 7 km :", round(modele.predict([[7]])[0]), "FCFA")

Pourquoi reshape(-1, 1) ?

sklearn attend que X soit un tableau à deux dimensions : une ligne par exemple, une colonne par caractéristique. Même avec une seule caractéristique, il faut cette forme.

np.array([1, 2, 3]) est à une dimension (forme (3,)). .reshape(-1, 1) le transforme en colonne (forme (3, 1)) : 3 exemples, 1 caractéristique. Le -1 veut dire « calcule toi-même ce nombre » (ici 3).

La cible y, elle, reste à une dimension. Avec un DataFrame pandas, le problème ne se pose pas : df[["surface", "chambres"]] (doubles crochets) est déjà un tableau 2D, df["prix"] est 1D. C'est pour ça qu'on travaillera surtout avec pandas.

Exercice : Ton premier modèle

On a les surfaces (en m²) et les prix de 6 terrains. Entraîne une régression linéaire pour prédire le prix à partir de la surface, puis :

  • range la surface au bon format 2D dans X (avec .reshape(-1, 1)) ;
  • entraîne modele ;
  • prix_300 : le prix prédit pour un terrain de 300 m², arrondi à l'entier.
Voir une solution
import numpy as np
from sklearn.linear_model import LinearRegression

surface = np.array([100, 150, 200, 250, 400, 500])
prix = np.array([5000000, 7000000, 9500000, 12000000, 19000000, 24000000])

X = surface.reshape(-1, 1)
modele = LinearRegression()
modele.fit(X, prix)

prix_300 = round(modele.predict([[300]])[0])
print(prix_300)

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