Aller au contenu

Partie 3 – Classification : Random Forest, SVM, ROC et AUC

  • 13h00 – 15h00
  • Théorie 40 min · TP 7 50 min · partage 15 min
  • Slides 24 à 32

Et si on savait, avant la course, si le client laissera un pourboire ?

Quels critères vous feraient parier sur un pourboire : la distance, le quartier, l’heure ? Ce sont nos futures features.

Random Forest : la sagesse des foulesSVM : la meilleure frontière
PrincipeDes dizaines d’arbres, chacun entraîné sur un échantillon et un sous-ensemble de features différents. Les arbres votentCherche la frontière qui sépare les deux classes avec la plus grande marge
Pourquoi ça marcheUn arbre seul sur-apprend facilement ; 50 arbres se trompent chacun différemment et leurs erreurs se compensentPlusieurs droites sépareraient les nuages ; celle qui laisse le plus de marge généralise mieux
SortiesUne probabilité et l’importance des featuresUne décision (pas de probabilité)
RéglagesRobuste, peu de réglages (numTrees, maxDepth)Normaliser les features avant (StandardScaler)
Dans SparkRandomForestClassifierLinearSVC : frontière linéaire uniquement, pas de noyau
Random Forest SVM
Arbre 1 → oui ○ ○ ○ │ marge │ ● ●
Arbre 2 → non ○ ○ ○ ○ │ │ ● ● ●
Arbre 3 → oui ○ ○ │ │ ● ●
Vote : 2 oui, 1 non → OUI frontière

Autres classifieurs disponibles : LogisticRegression, GBTClassifier, NaiveBayes, MultilayerPerceptronClassifier.

🔍 Vulgarisation : Comment 50 arbres « moyens » deviennent plus intelligents qu'un seul grand arbre ? (Random Forest)

Si vous entraînez 50 fois le même arbre sur les mêmes données, vous obtiendrez 50 clones identiques qui feront exactement les mêmes erreurs. Pour que le vote de la foule fonctionne, le Random Forest introduit deux doses de hasard :

  1. Hasard sur les lignes (Bootstrap / Bagging) : chaque arbre ne reçoit qu’un tirage aléatoire (avec remise) des courses d’entraînement. L’arbre n°1 n’a pas vu tout à fait les mêmes courses que l’arbre n°2.
  2. Hasard sur les colonnes (Feature Subsampling) : à chaque embranchement, l’arbre n’a le droit de choisir sa question que parmi un sous-ensemble tiré au sort des colonnes (par exemple 2 colonnes sur 5). Cela oblige certains arbres à explorer l’effet de l’heure ou de manhattan au lieu de tous couper immédiatement sur trip_distance.

Résultat : quand une course arrive en test, les 50 arbres votent. Si 35 arbres votent « Pourboire (1) » et 15 votent « Rien (0) », Spark crée :

  • rawPrediction = [15.0, 35.0] (le décompte des voix),
  • probability = [0.30, 0.70] (30 % non, 70 % oui),
  • prediction = 1.0 (car $0,70 \ge 0,50$, le seuil par défaut).

Random Forest, pourboire oui / non, seuil 0,5, sur les 17 963 courses de test payées par carte :

Prédit : pourboirePrédit : rien
Réel : pourboire5 595 vrais positifs (VP)3 789 faux négatifs (FN)
Réel : rien2 780 faux positifs (FP)5 799 vrais négatifs (VN)
MétriqueFormuleValeurLecture
Exactitude (accuracy)(VP + VN) / total63 %Bonnes réponses sur l’ensemble
PrécisionVP / (VP + FP)67 %Quand je dis « pourboire », j’ai raison
Rappel (recall)VP / (VP + FN)60 %Part des vrais pourboires retrouvés

Lisez la matrice ligne par ligne (la réalité), puis colonne par colonne (la prédiction). Calculez la précision à la main : 5 595 / (5 595 + 2 780) ≈ 0,67.

Quelle métrique choisir ? Celle qui reflète le coût des erreurs dans votre usage.

  • Notification « pensez au pourboire » aux clients prédits « rien » : un faux négatif coûte peu → viser le rappel.
  • Prime au chauffeur sur la prédiction : un faux positif coûte cher → viser la précision.
  • Le seuil (0,5 par défaut) arbitre : plus bas, plus de rappel et moins de précision.
🔍 Vulgarisation : Retenir Précision vs Rappel pour toute la vie (l'analogie du filet de pêche)

Imaginez qu’il y a 100 thons (les vrais positifs à trouver) au milieu de 1 000 méduses dans la mer :

  • La Précision (Precision) = la pureté de votre filet :
    • Question : « Sur tout ce que j’ai remonté dans mon filet, quel pourcentage est vraiment du thon ? »
    • Si vous pêchez à la ligne avec un appât ultra-sélectif et que vous attrapez 10 poissons dont 10 thons : votre Précision est de 100 % ($10/10$) ! Mais vous avez laissé 90 thons dans l’eau (Rappel = 10 %).
  • Le Rappel (Recall) = la part des thons de la mer que vous avez capturés :
    • Question : « Sur les 100 thons qui étaient dans l’eau, combien en ai-je attrapé ? »
    • Si vous tirez un chalut géant qui ramasse les 100 thons + 400 méduses (500 prises au total) : votre Rappel est de 100 % ($100/100$, aucun thon ne vous a échappé), mais votre Précision tombe à 20 % ($100/500$).

Application métier :

  • Dépistage médical ou alerte de panne critique ➔ on vise le Rappel (on préfère vérifier 3 fausses alertes plutôt que de rater 1 vraie panne).
  • Envoi automatique d’un bon d’achat coûteux ou blocage de carte bancaire ➔ on vise la Précision (quand on agit, on veut être sûr d’avoir raison).

Évaluer un classifieur : la courbe ROC et l’AUC

Section intitulée « Évaluer un classifieur : la courbe ROC et l’AUC »
Taux de vrais positifs
1 ┤ ╭─────────────
│ ╭────╯ ← modèle (chaque point = un seuil)
│ ╭───╯ ⟋
│ ╭─╯ ⟋ ← hasard (AUC = 0,5)
│ ╭─╯ ⟋
0 ┼─╯──⟋────────────────────────
0 1 Taux de faux positifs
  • Chaque point de la courbe est un seuil. En bas à gauche : seuil 1, on ne prédit jamais « pourboire ». En haut à droite : seuil 0, on prédit toujours « pourboire ».
  • Plus la courbe monte vite, meilleur est le modèle. Chaque point correspond à une matrice de confusion différente.
  • AUC = aire sous la courbe : 0,5 = hasard, 1 = parfait. Indépendante du seuil, c’est la métrique de comparaison entre modèles.
ModèleAUC
Random Forest (50 arbres, profondeur 6)0,70
LinearSVC0,70

0,70 est correct pour un comportement humain avec 5 features, loin d’être parfait. Un modèle linéaire fait presque aussi bien ici.

from pyspark.ml.evaluation import BinaryClassificationEvaluator
pred = model.transform(test) # model : le pipeline ajusté sur train (corrigé tp7_classification.py)
auc = BinaryClassificationEvaluator(metricName="areaUnderROC").evaluate(pred) # colonnes rawPrediction et label

Vote à main levée ou Slido, puis une minute de débat par question. Réponses détaillées dans le quiz du jour 2.

  1. Un détecteur de fraude répond toujours « pas de fraude ». Exactitude : 99 %. Bon modèle ?
  2. Mon modèle fait 99 % en train et 60 % en test. Que se passe-t-il ?
  3. Pour prédire la durée d’une course, puis-je utiliser l’heure d’arrivée ?
  4. Mon classifieur a une AUC de 0,5. Que fait-il ?

La question 3 mérite une section entière : c’est le piège n° 1.

CasCe qui se passeRemède
Les pourboires en espèces ne sont pas enregistrésAvec payment_type comme feature, l’AUC monte à 0,77… le modèle a appris « espèces ⇒ pas de pourboire ». Il a appris le mode de paiement, pas la générositéNe garder que les paiements par carte (payment_type = 1)
total_amount contient déjà le tarifEn régression, R² = 0,976 : excellent, mais total_amount n’est connu qu’après la courseRetirer toute colonne calculée après l’événement

Pour chaque feature, une seule question : la connaîtrai-je au moment de prédire ?

Le cas 1 est aussi un biais de mesure : dans les données TLC réelles, tip_amount = 0 pour les espèces. Nos conclusions ne valent que pour les paiements par carte.

Autres fuites classiques : normaliser sur toutes les données avant le split (le Pipeline l’évite), utiliser l’heure d’arrivée pour prédire la durée.

TP 7 – Prédire le pourboire (50 min) : Random Forest contre LinearSVC, AUC, matrice de confusion, courbe ROC en Matplotlib, sauvegarde du modèle pour demain.

  • AUC 0,70 : est-ce un bon modèle ? Honnête pour un comportement humain avec 5 features. On gagnerait avec la zone précise, le jour, la météo.
  • Précision ou rappel : lequel privilégier ? Ça dépend de ce que coûte un faux positif par rapport à un faux négatif dans l’usage métier.
  • À retenir : la métrique se choisit selon le coût des erreurs.

Pause de 15 minutes, puis la partie 4 : apprendre sans étiquette.

Dépôt des participants : formations2026/formation-spark-ml (branche participants)

Contenu pédagogique © Ambient IT · 140 Avenue Jean Lolive, 93500 Pantin · formation@ambient-it.net · +33 (0)1 48 10 09 46

Organisme de formation enregistré sous le numéro 11 75 54743 75. Cet enregistrement ne vaut pas agrément de l'État.

v 6264cf4