Retour au blog

Machine Learning avec Python : Régression & Classification

Explore les concepts clés du Machine Learning, de la préparation des données à l'implémentation de modèles de régression et de classification avec Python.

Cet article a été rédigé à des fins pédagogiques. Les informations présentées peuvent évoluer. Nous t’invitons à vérifier auprès de sources officielles.

Objectifs du cours :

  • Comprendre les principes fondamentaux du Machine Learning.
  • Maîtriser les étapes de préparation et de prétraitement des données.
  • Implémenter des modèles de régression linéaire avec Python (Scikit-learn).
  • Évaluer la performance des modèles de régression.
  • Implémenter des modèles de classification (régression logistique, arbres de décision) avec Python.
  • Évaluer la performance des modèles de classification (matrice de confusion, métriques).
  • Appliquer les bonnes pratiques pour éviter le surapprentissage et le sous-apprentissage.

Prérequis :

  • Connaissances de base en programmation Python (variables, boucles, fonctions, structures de données).
  • Notions élémentaires en statistiques et probabilités.
  • Familiarité avec les bibliothèques Python NumPy et Pandas.
  • Un environnement de développement Python (comme Jupyter Notebook ou VS Code) installé.

Salut à toi, futur expert en Data Science ! Le Machine Learning (ML) est au cœur de l'innovation technologique actuelle. Comprendre ses mécanismes et savoir l'implémenter est une compétence indispensable.

Ce cours est conçu pour te guider pas à pas dans l'univers du ML avec Python. Nous allons explorer ensemble les concepts fondamentaux, de la préparation des données à la construction de modèles prédictifs.

Prépare-toi à coder et à expérimenter, car c'est en pratiquant que tu maîtriseras ces techniques. Attache ta ceinture, l'aventure commence maintenant !

I. Introduction au Machine Learning et à Python

I.1. Qu'est-ce que le Machine Learning ?

Le Machine Learning, ou apprentissage automatique, est une branche de l'intelligence artificielle. Il permet aux systèmes informatiques d'apprendre à partir de données sans être explicitement programmés pour chaque tâche.

L'objectif est de découvrir des patterns et des relations dans les données. Ces patterns sont ensuite utilisés pour faire des prédictions ou prendre des décisions.

Définition : Machine Learning

Le Machine Learning est un domaine de l'intelligence artificielle qui donne aux ordinateurs la capacité d'apprendre à partir de données, d'identifier des schémas et de prendre des décisions avec une intervention humaine minimale.

Il existe principalement trois types d'apprentissage automatique : supervisé, non supervisé et par renforcement. Dans ce cours, nous nous concentrerons sur l'apprentissage supervisé.

L'apprentissage supervisé utilise des données étiquetées, c'est-à-dire des paires entrée-sortie. Le modèle apprend à mapper les entrées aux sorties souhaitées.

I.2. Pourquoi Python pour le Machine Learning ?

Python est devenu le langage de référence pour le Machine Learning et la Data Science. Sa popularité repose sur plusieurs atouts majeurs.

Il possède une syntaxe claire et facile à apprendre, ce qui rend le code lisible et maintenable. De plus, il dispose d'un écosystème riche de bibliothèques dédiées.

Point clé : Avantages de Python pour le ML

  • Simplicité et lisibilité : Favorise un développement rapide.
  • Vaste écosystème : Des bibliothèques puissantes comme NumPy, Pandas, Scikit-learn, Matplotlib.
  • Communauté active : Support et ressources abondantes.
  • Polyvalence : Utilisable pour le développement web, l'automatisation, et bien d'autres domaines.

I.3. Vue d'ensemble des types de problèmes de ML

En apprentissage supervisé, on distingue principalement deux grandes catégories de problèmes : la régression et la classification.

Ces deux types de problèmes ont des objectifs et des types de sorties bien différents.

Définition : Régression

La régression est une tâche d'apprentissage supervisé dont l'objectif est de prédire une valeur continue. Par exemple, prédire le prix d'une maison ou la température de demain.

Définition : Classification

La classification est une tâche d'apprentissage supervisé dont l'objectif est de prédire une catégorie discrète ou une classe. Par exemple, prédire si un e-mail est un spam ou non, ou identifier la race d'un animal sur une image.

À retenir :

Le Machine Learning permet aux machines d'apprendre des données. Python est le langage privilégié grâce à ses bibliothèques comme Scikit-learn. La régression prédit des valeurs continues, tandis que la classification prédit des catégories.

II. Préparation des Données : La Phase Cruciale

II.1. Collecte et exploration des données (Pandas)

Avant de construire un modèle, tu dois comprendre tes données. La collecte est la première étape, souvent suivie d'une phase d'exploration.

L'exploration des données (EDA) consiste à analyser les jeux de données pour en résumer les principales caractéristiques. Cela te permet de détecter des anomalies, de tester des hypothèses et de visualiser les distributions.

Exemple 1 : Chargement et exploration avec Pandas

Supposons que tu as un fichier CSV nommé ventes.csv contenant des données de ventes. Voici comment tu peux le charger et l'explorer rapidement avec Pandas.

Étape 1 : Importer Pandas et charger les données

import pandas as pd
df = pd.read_csv('ventes.csv')

Étape 2 : Afficher les premières lignes et les informations générales

print(df.head())
print(df.info())
print(df.describe())

df.head() montre les cinq premières lignes, df.info() donne un résumé des colonnes et de leurs types, et df.describe() fournit des statistiques descriptives pour les colonnes numériques.

II.2. Nettoyage et prétraitement

Les données brutes sont rarement parfaites. Elles peuvent contenir des valeurs manquantes, des doublons, des erreurs ou des formats incohérents. Le nettoyage est essentiel.

Le prétraitement comprend la gestion des valeurs manquantes, l'encodage des variables catégorielles et la détection des valeurs aberrantes.

II.2.1. Gestion des valeurs manquantes

Les valeurs manquantes peuvent biaiser tes modèles ou les faire échouer. Tu as plusieurs options pour les gérer.

Tu peux les supprimer (lignes ou colonnes entières), les imputer avec une valeur (moyenne, médiane, mode) ou utiliser des méthodes plus avancées.

Erreur classique : Suppression aveugle des valeurs manquantes

Supprimer toutes les lignes contenant des valeurs manquantes peut entraîner une perte significative d'informations. Évalue l'impact avant de le faire, surtout si de nombreuses lignes sont concernées.

Exemple 2 : Gestion des valeurs manquantes

Continuons avec notre DataFrame df. Supposons qu'il y ait des valeurs manquantes dans la colonne 'Prix'.

Étape 1 : Vérifier les valeurs manquantes

print(df.isnull().sum())

Cela te montrera le nombre de valeurs manquantes par colonne.

Étape 2 : Imputer avec la moyenne

df['Prix'].fillna(df['Prix'].mean(), inplace=True)

Ici, les valeurs manquantes de la colonne 'Prix' sont remplacées par la moyenne de cette colonne.

II.2.2. Encodage des variables catégorielles

Les algorithmes de Machine Learning fonctionnent généralement avec des nombres. Les variables catégorielles (ex: "Rouge", "Vert", "Bleu") doivent être converties.

Deux méthodes courantes sont l'encodage ordinal (pour les catégories ordonnées) et l'encodage One-Hot (pour les catégories nominales).

Définition : Encodage One-Hot

L'encodage One-Hot crée de nouvelles colonnes binaires pour chaque catégorie d'une variable. Si une observation appartient à une catégorie, la colonne correspondante aura 1, sinon 0.

II.3. Normalisation et standardisation

Ces techniques visent à transformer tes données numériques pour qu'elles aient une échelle similaire. Cela est crucial pour de nombreux algorithmes de ML sensibles à l'échelle des variables.

La normalisation (Min-Max Scaling) met les données entre 0 et 1. La standardisation (Z-score normalization) les transforme pour avoir une moyenne de 0 et un écart-type de 1.

Formule de Standardisation (Z-score) :

$$x' = \frac{x - \mu}{\sigma}$$

Où $x'$ est la valeur standardisée, $x$ est la valeur originale, $\mu$ est la moyenne et $\sigma$ est l'écart-type.

II.4. Séparation des jeux de données (entraînement, validation, test)

Pour évaluer la performance de ton modèle de manière fiable, tu dois séparer tes données en plusieurs sous-ensembles. C'est une étape fondamentale du processus de ML.

Le jeu d'entraînement est utilisé pour que le modèle "apprenne". Le jeu de test évalue la performance du modèle sur des données qu'il n'a jamais vues.

Propriété : Importance du jeu de test

Le jeu de test doit être complètement indépendant du jeu d'entraînement et de validation. C'est la seule façon d'obtenir une estimation impartiale de la performance généralisée de ton modèle sur de nouvelles données.

Exemple 3 : Séparer les données avec Scikit-learn

Utilise train_test_split de Scikit-learn pour diviser tes données en ensembles d'entraînement et de test.

Étape 1 : Importer la fonction

from sklearn.model_selection import train_test_split
X = df[['Feature1', 'Feature2']] # Tes variables explicatives
y = df['Target'] # Ta variable cible

Étape 2 : Diviser les données

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

Ici, 20% des données sont réservées pour le test. random_state assure la reproductibilité de la division.

À retenir :

La préparation des données est 80% du travail en ML. Explore tes données, gère les valeurs manquantes et les variables catégorielles. Normalise/standardise tes données et sépare-les en ensembles d'entraînement et de test pour une évaluation fiable.

III. Régression Linéaire : Le Fondement de la Prédiction Continue

III.1. Principe de la régression linéaire simple

La régression linéaire est l'un des algorithmes de Machine Learning les plus basiques. Elle permet de modéliser la relation linéaire entre une variable dépendante continue et une ou plusieurs variables indépendantes.

Dans sa forme simple, elle cherche à ajuster la "meilleure" droite à un ensemble de points de données. Cette droite minimise la somme des carrés des erreurs entre les valeurs prédites et les valeurs réelles.

Formule de la régression linéaire simple :

$$y = \beta_0 + \beta_1 x + \epsilon$$

Où $y$ est la variable dépendante, $x$ est la variable indépendante, $\beta_0$ est l'ordonnée à l'origine, $\beta_1$ est la pente, et $\epsilon$ est le terme d'erreur.

III.2. Modèle de régression linéaire multiple

Lorsque tu as plusieurs variables indépendantes pour prédire ta variable cible, tu utilises la régression linéaire multiple. Le principe reste le même.

Tu cherches à trouver les coefficients qui, combinés linéairement avec tes variables d'entrée, prédisent au mieux la variable cible. Le modèle s'étend simplement à plus de dimensions.

Formule de la régression linéaire multiple :

$$y = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + ... + \beta_n x_n + \epsilon$$

Où $x_1, x_2, ..., x_n$ sont les variables indépendantes et $\beta_1, \beta_2, ..., \beta_n$ leurs coefficients respectifs.

III.3. Fonction de coût et descente de gradient

Comment le modèle trouve-t-il la "meilleure" droite ou hyperplan ? Il utilise une fonction de coût (ou de perte) pour mesurer l'erreur de ses prédictions.

Pour la régression linéaire, la fonction de coût la plus courante est l'erreur quadratique moyenne (Mean Squared Error - MSE). L'algorithme cherche à minimiser cette fonction de coût.

Définition : Fonction de coût (MSE)

La fonction de coût MSE mesure la moyenne des carrés des différences entre les valeurs prédites ($\hat{y}_i$) et les valeurs réelles ($y_i$).

$$MSE = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2$$

La descente de gradient est l'algorithme d'optimisation souvent utilisé pour minimiser la fonction de coût. Il ajuste itérativement les coefficients du modèle dans la direction où la fonction de coût diminue le plus rapidement.

III.4. Implémentation avec Scikit-learn

Scikit-learn est la bibliothèque incontournable pour le Machine Learning en Python. Elle offre une interface simple et cohérente pour de nombreux modèles.

L'implémentation d'une régression linéaire est très concise et suit un schéma classique en Scikit-learn : instancier le modèle, l'entraîner, puis faire des prédictions.

Exemple 4 : Régression Linéaire avec Scikit-learn

Utilisons un ensemble de données simple pour prédire un score en fonction des heures d'étude.

Étape 1 : Préparer les données d'exemple

import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score

# Créer des données d'exemple
np.random.seed(0)
heures_etude = np.random.rand(100, 1) * 10 # Entre 0 et 10 heures
score_examen = 2 * heures_etude + np.random.randn(100, 1) * 2 + 30 # Score = 2*heures + bruit + 30
df_etude = pd.DataFrame({'HeuresEtude': heures_etude.flatten(), 'ScoreExamen': score_examen.flatten()})

X = df_etude[['HeuresEtude']]
y = df_etude['ScoreExamen']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

Étape 2 : Instancier et entraîner le modèle

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

La méthode .fit() est l'étape d'apprentissage où le modèle ajuste ses coefficients aux données d'entraînement.

Étape 3 : Faire des prédictions

y_pred = model_lr.predict(X_test)

La méthode .predict() utilise le modèle entraîné pour générer des prédictions sur de nouvelles données.

III.5. Évaluation des modèles de régression

Une fois ton modèle entraîné, tu dois évaluer sa performance. Pour la régression, plusieurs métriques sont couramment utilisées.

Les métriques les plus importantes sont l'erreur quadratique moyenne (MSE), l'erreur absolue moyenne (MAE) et le coefficient de détermination ($R^2$).

Définition : Coefficient de détermination ($R^2$)

Le $R^2$ mesure la proportion de la variance de la variable dépendante qui est expliquée par les variables indépendantes du modèle. Il varie entre 0 et 1, un $R^2$ plus proche de 1 indiquant un meilleur ajustement du modèle.

Étape 4 (suite de l'Exemple 4) : Évaluer le modèle

mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

print(f"MSE sur le jeu de test : {mse:.2f}")
print(f"R² sur le jeu de test : {r2:.2f}")
print(f"Coefficient (pente) : {model_lr.coef_[0]:.2f}")
print(f"Ordonnée à l'origine : {model_lr.intercept_:.2f}")

À retenir :

La régression linéaire modélise des relations continues. Elle cherche à minimiser une fonction de coût (MSE) via la descente de gradient.

Scikit-learn simplifie son implémentation. Évalue-la avec le MSE et le $R^2$ pour juger de sa performance.

IV. Régression Logistique : La Classification Binaire en Action

IV.1. Pourquoi la régression linéaire n'est pas adaptée à la classification

Tu pourrais être tenté d'utiliser la régression linéaire pour la classification en associant des nombres à tes catégories (ex: 0 pour "non-spam", 1 pour "spam"). Cependant, ce n'est pas une bonne idée.

La régression linéaire prédit des valeurs continues, ce qui signifie que ses sorties peuvent être inférieures à 0 ou supérieures à 1. Ces valeurs n'ont pas de sens pour des probabilités de classe.

De plus, la régression linéaire est sensible aux valeurs aberrantes, ce qui peut fausser la ligne de décision pour la classification. Elle n'est pas conçue pour modéliser des probabilités.

IV.2. Le rôle de la fonction Sigmoïde

La régression logistique résout ce problème en utilisant une fonction Sigmoïde (aussi appelée fonction logistique). Cette fonction "écrase" n'importe quelle valeur réelle entre 0 et 1.

Elle prend en entrée la sortie linéaire du modèle et la transforme en une probabilité. C'est ce qui permet à la régression logistique de prédire des probabilités d'appartenance à une classe.

Formule de la fonction Sigmoïde :

$$\sigma(z) = \frac{1}{1 + e^{-z}}$$

Où $z$ est la combinaison linéaire des variables d'entrée et de leurs coefficients, similaire à la sortie d'un modèle de régression linéaire.

Si la probabilité calculée est supérieure à un certain seuil (généralement 0.5), la classe est prédite comme positive (1). Sinon, elle est prédite comme négative (0).

IV.3. Interprétation des probabilités

La sortie de la fonction Sigmoïde est une probabilité. Par exemple, si le modèle prédit 0.7 pour une observation, cela signifie qu'il y a 70% de chances qu'elle appartienne à la classe positive.

Cette interprétation probabiliste est très utile et permet d'aller au-delà d'une simple classification binaire. Tu peux ajuster le seuil de décision en fonction de tes besoins métiers.

IV.4. Implémentation avec Scikit-learn

Comme pour la régression linéaire, Scikit-learn simplifie grandement l'implémentation de la régression logistique. Le processus reste le même : instancier, entraîner et prédire.

La classe LogisticRegression est robuste et efficace pour la classification binaire et multi-classe.

Attention : "Régression" Logistique

Ne te laisse pas tromper par le nom ! La régression logistique est un algorithme de CLASSIFICATION, pas de régression. Le terme "régression" vient de son utilisation d'une fonction linéaire comme base avant l'application de la sigmoïde.

Exemple 5 : Classification avec Régression Logistique

Créons des données pour un problème de classification binaire, par exemple, prédire si un client va acheter un produit (1) ou non (0) en fonction de son âge et de ses revenus.

Étape 1 : Préparer les données d'exemple

from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification # Pour générer des données de classification
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report

X, y = make_classification(n_samples=100, n_features=2, n_informative=2,
                           n_redundant=0, n_clusters_per_class=1, random_state=42)
# X sont les caractéristiques, y est la variable cible (0 ou 1)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

Étape 2 : Instancier et entraîner le modèle

model_lr_clf = LogisticRegression(random_state=42)
model_lr_clf.fit(X_train, y_train)

Étape 3 : Faire des prédictions

y_pred_clf = model_lr_clf.predict(X_test)
y_pred_proba = model_lr_clf.predict_proba(X_test)[:, 1] # Probabilités de la classe positive

.predict() donne la classe prédite (0 ou 1), tandis que .predict_proba() donne les probabilités pour chaque classe.

IV.5. Évaluation des modèles de classification

L'évaluation des modèles de classification est différente de celle des modèles de régression. L'accuracy (précision globale) est un bon début, mais elle n'est pas toujours suffisante, surtout avec des classes déséquilibrées.

La matrice de confusion est un outil essentiel pour comprendre les performances de ton classifieur. Elle décompose les prédictions en quatre catégories : Vrais Positifs (VP), Vrais Négatifs (VN), Faux Positifs (FP) et Faux Négatifs (FN).

Prédit Positif Prédit Négatif
Réel Positif Vrais Positifs (VP) Faux Négatifs (FN)
Réel Négatif Faux Positifs (FP) Vrais Négatifs (VN)

À partir de la matrice de confusion, tu peux calculer d'autres métriques clés comme la précision (Precision), le rappel (Recall), et le F1-score.

Formules de métriques de classification :

$$Précision = \frac{VP}{VP + FP}$$

$$Rappel = \frac{VP}{VP + FN}$$

$$F1-score = 2 \times \frac{Précision \times Rappel}{Précision + Rappel}$$

La précision indique la proportion de prédictions positives qui étaient correctes. Le rappel mesure la proportion d'instances positives réelles qui ont été correctement identifiées.

Étape 4 (suite de l'Exemple 5) : Évaluer le modèle

accuracy = accuracy_score(y_test, y_pred_clf)
conf_matrix = confusion_matrix(y_test, y_pred_clf)
class_report = classification_report(y_test, y_pred_clf)

print(f"Accuracy : {accuracy:.2f}")
print("Matrice de confusion :\n", conf_matrix)
print("Rapport de classification :\n", class_report)

À retenir :

La régression logistique est un algorithme de classification qui utilise la fonction Sigmoïde pour prédire des probabilités de classe. Évalue sa performance avec l'accuracy, la matrice de confusion, la précision, le rappel et le F1-score.

V. Arbres de Décision et Forêts Aléatoires : Modèles Puissants et Interprétables

V.1. Fonctionnement d'un arbre de décision

Les arbres de décision sont des algorithmes polyvalents qui peuvent être utilisés pour la régression et la classification. Ils modélisent les décisions comme un arbre.

Chaque nœud de l'arbre représente un test sur une caractéristique. Chaque branche représente le résultat de ce test et chaque feuille représente une décision finale ou une valeur prédite.

Définition : Arbre de Décision

Un arbre de décision est un modèle d'apprentissage supervisé qui utilise une structure arborescente pour prendre des décisions. Il divise récursivement les données en sous-ensembles en fonction des valeurs des caractéristiques.

Le processus de construction d'un arbre de décision implique de choisir la meilleure caractéristique pour diviser les données à chaque étape. Des critères comme l'impureté de Gini ou l'entropie sont utilisés pour cela.

V.2. Avantages et inconvénients des arbres

Les arbres de décision offrent plusieurs avantages. Ils sont faciles à comprendre et à interpréter, et leur visualisation est intuitive.

Ils peuvent gérer à la fois des données numériques et catégorielles sans nécessiter d'encodage complexe. Ils ne nécessitent pas de normalisation ou de standardisation des caractéristiques.

Cependant, les arbres de décision peuvent être sujets au surapprentissage (overfitting) s'ils sont trop profonds. Ils peuvent également être instables, de petites variations dans les données d'entraînement pouvant entraîner des arbres très différents.

V.3. Concept de l'ensemble learning : Forêts Aléatoires (Random Forest)

Pour pallier les inconvénients des arbres de décision uniques, l'approche de l'apprentissage d'ensemble (Ensemble Learning) a été développée. La Forêt Aléatoire (Random Forest) en est un excellent exemple.

Une Forêt Aléatoire construit un grand nombre d'arbres de décision indépendants. Pour la classification, la prédiction finale est la classe majoritaire votée par les arbres. Pour la régression, c'est la moyenne des prédictions des arbres.

Définition : Forêt Aléatoire (Random Forest)

Une Forêt Aléatoire est une méthode d'apprentissage d'ensemble qui construit plusieurs arbres de décision lors de l'entraînement. Elle combine leurs prédictions pour améliorer la robustesse et la précision par rapport à un arbre unique.

Deux mécanismes clés contribuent à la performance des Forêts Aléatoires : le "bagging" (bootstrap aggregating) et la sélection aléatoire des caractéristiques à chaque division. Cela réduit le surapprentissage et la variance.

V.4. Implémentation et hyperparamètres

L'implémentation des arbres de décision et des Forêts Aléatoires avec Scikit-learn est aussi simple que pour les modèles précédents.

Ces modèles ont de nombreux hyperparamètres que tu peux ajuster pour optimiser leurs performances. Par exemple, la profondeur maximale de l'arbre (max_depth) ou le nombre d'arbres dans une forêt (n_estimators).

Exemple 6 : Forêt Aléatoire pour la Classification

Reprenons les données de classification de l'exemple précédent pour appliquer une Forêt Aléatoire.

Étape 1 : Importer le modèle

from sklearn.ensemble import RandomForestClassifier

# Utiliser X_train, X_test, y_train, y_test des exemples précédents

Étape 2 : Instancier et entraîner le modèle

model_rf_clf = RandomForestClassifier(n_estimators=100, random_state=42)
model_rf_clf.fit(X_train, y_train)

n_estimators=100 signifie que la forêt construira 100 arbres de décision.

Étape 3 : Faire des prédictions et évaluer

y_pred_rf = model_rf_clf.predict(X_test)
accuracy_rf = accuracy_score(y_test, y_pred_rf)
print(f"Accuracy de la Forêt Aléatoire : {accuracy_rf:.2f}")
print("Rapport de classification Forêt Aléatoire :\n", classification_report(y_test, y_pred_rf))

À retenir :

Les arbres de décision sont intuitifs mais peuvent surapprendre. Les Forêts Aléatoires améliorent leur robustesse en combinant plusieurs arbres. Ajuste les hyperparamètres comme n_estimators ou max_depth pour optimiser la performance.

VI. Cas Pratiques et Bonnes Pratiques en ML

VI.1. Gestion du surapprentissage (overfitting) et sous-apprentissage (underfitting)

Comprendre et gérer le surapprentissage et le sous-apprentissage est fondamental en Machine Learning. Ces deux phénomènes représentent un équilibre délicat.

Le sous-apprentissage (underfitting) se produit lorsque ton modèle est trop simple pour capturer la complexité des données. Il a de mauvaises performances sur l'entraînement et le test.

Le surapprentissage (overfitting) arrive quand ton modèle est trop complexe et a mémorisé les données d'entraînement, y compris le bruit. Il aura une excellente performance sur l'entraînement, mais une mauvaise sur le test.

Erreur classique : Se fier uniquement au score d'entraînement

Un modèle qui a un score parfait sur les données d'entraînement mais des performances médiocres sur les données de test est un signe clair de surapprentissage. Ne jamais évaluer ton modèle uniquement sur l'entraînement !

Pour lutter contre le surapprentissage, tu peux réduire la complexité du modèle (moins de caractéristiques, profondeur d'arbre limitée), utiliser plus de données, ou appliquer des techniques de régularisation. Pour le sous-apprentissage, tu dois augmenter la complexité du modèle ou ajouter des caractéristiques pertinentes.

VI.2. Validation croisée (Cross-validation)

La validation croisée est une technique robuste pour évaluer la performance de ton modèle et réduire la variance de l'estimation.

Au lieu de diviser tes données une seule fois en entraînement/test, la validation croisée divise les données en plusieurs sous-ensembles. Le modèle est entraîné et évalué plusieurs fois sur différentes combinaisons de ces sous-ensembles.

Définition : Validation Croisée K-Fold

La validation croisée K-Fold divise l'ensemble de données en K "folds" (plis) de taille égale. Le modèle est entraîné K fois, utilisant à chaque fois K-1 folds pour l'entraînement et le fold restant pour la validation. La performance finale est la moyenne des K scores.

Cette méthode donne une estimation plus fiable de la performance généralisée de ton modèle. Elle est particulièrement utile pour le réglage des hyperparamètres.

VI.3. Pipeline de Machine Learning

Lorsque tu construis un modèle de Machine Learning, plusieurs étapes se succèdent : prétraitement, sélection de caractéristiques, entraînement du modèle, etc.

Les Pipelines Scikit-learn te permettent de chaîner ces étapes de manière organisée. Cela rend ton code plus propre, plus lisible et moins sujet aux erreurs.

Avantages des Pipelines :

  • Cohérence : Applique les mêmes transformations aux données d'entraînement et de test.
  • Simplicité : Réduit le code répétitif.
  • Prévention des fuites de données : Empêche les informations du jeu de test de contaminer le processus d'entraînement.

VI.4. Interprétabilité et explicabilité des modèles

Dans de nombreux domaines, il ne suffit pas que le modèle soit performant ; il doit aussi être compréhensible. L'interprétabilité est la capacité à expliquer les prédictions du modèle.

Pourquoi le modèle a-t-il prédit un certain prix ? Quelles caractéristiques ont été les plus importantes pour classer un e-mail comme spam ? Ces questions sont essentielles.

Certains modèles, comme la régression linéaire ou les arbres de décision simples, sont intrinsèquement plus interprétables. Pour les modèles plus complexes (comme les forêts aléatoires), des techniques d'explicabilité (ex: SHAP, LIME) sont nécessaires.

À retenir :

Évite le surapprentissage et le sous-apprentissage pour des modèles généralisables. Utilise la validation croisée pour une évaluation robuste.

Les pipelines simplifient ton workflow ML. N'oublie pas l'importance de l'interprétabilité pour les applications concrètes.

Récapitulatif Final

Félicitations ! Tu as parcouru les fondamentaux du Machine Learning, de la préparation des données aux modèles de régression et de classification. Voici un tableau synthétique pour fixer les idées :

Concept / Modèle Description Bibliothèque Python Type de Problème Métriques Clés
Préparation des données Nettoyage, encodage, normalisation, séparation Pandas, Scikit-learn Tous Visualisation, Statistiques
Régression Linéaire Prédit une valeur continue par une relation linéaire Scikit-learn Régression MSE, MAE, R²
Régression Logistique Prédit une catégorie (0 ou 1) via une fonction Sigmoïde Scikit-learn Classification Accuracy, Précision, Rappel, F1-score, Matrice de confusion
Arbre de Décision Modèle arborescent de décision Scikit-learn Régression / Classification Idem selon le type
Forêt Aléatoire Ensemble de multiples arbres de décision pour plus de robustesse Scikit-learn Régression / Classification Idem selon le type
Validation Croisée Évaluation robuste des modèles sur plusieurs divisions des données Scikit-learn Tous Scores moyens du modèle
Sur/Sous-apprentissage Problèmes de généralisation du modèle Observation des scores Train/Test Tous Scores Train vs Test

Exercices d'Application Rapides

  1. Nettoyage de données : Tu as un DataFrame Pandas df_clients avec une colonne 'Âge' contenant des valeurs manquantes. Propose une ligne de code Python pour remplacer ces valeurs manquantes par la médiane de la colonne 'Âge'.

    Correction :

    df_clients['Âge'].fillna(df_clients['Âge'].median(), inplace=True)
  2. Régression Linéaire : Si un modèle de régression linéaire a un $R^2$ de 0.95 sur son jeu d'entraînement et un $R^2$ de 0.10 sur son jeu de test, quelle conclusion peux-tu en tirer ?

    Correction :

    Cela indique un fort surapprentissage (overfitting). Le modèle a parfaitement mémorisé les données d'entraînement mais ne généralise pas du tout aux nouvelles données.

  3. Classification : Dans un problème de classification binaire, ton modèle prédit 10 Vrais Positifs, 5 Faux Positifs, 3 Faux Négatifs et 80 Vrais Négatifs. Calcule la Précision et le Rappel de ce modèle.

    Correction :

    Précision = $VP / (VP + FP) = 10 / (10 + 5) = 10 / 15 \approx 0.67$

    Rappel = $VP / (VP + FN) = 10 / (10 + 3) = 10 / 13 \approx 0.77$

  4. Type de Modèle : Pour prédire si un étudiant réussira ou échouera à un examen, quel type d'algorithme de Machine Learning (régression ou classification) devrais-tu utiliser et pourquoi ?

    Correction :

    Tu devrais utiliser un algorithme de classification. La variable cible ("réussira" ou "échouera") est une catégorie discrète, pas une valeur continue.

Comment ORBITECH Peut T'aider

Chez ORBITECH AI Academy, nous sommes là pour faciliter ton parcours en Machine Learning. Nos outils sont conçus pour te donner les clés de la réussite et t'aider à maîtriser chaque concept, de la théorie à la pratique. Nous t'accompagnons dans la structuration de tes révisions et la mise en application de tes connaissances en Data Science.

Contenu en libre diffusion — partage autorisé sous réserve de mentionner ORBITECH AI Academy comme source.

DEVIENS UN EXPERT EN MACHINE LEARNING

Maîtrise les techniques essentielles pour analyser tes données et construire des modèles prédictifs performants.

Commencer gratuitement
🌍 ORBITECH AI Academy — Free education in 88 languages for 171 countries