Save 37% off PRO during our Black Friday Sale! »

Chercher l'aiguille dans... les données

Chercher l'aiguille dans... les données

Lorsqu'on recherche des signaux faibles dans la donnée, l'un des défis auxquels on est confronté lors de l'entraînement d'un modèle de classification est de gérer des classes très déséquilibrées. Dans cette présentation je parlerai des méthodes pour aborder ce problème et avoir un modèle performant.

Women in Data Science Paris @ Women Power IT
30 minutes - à distance

https://sites.google.com/view/widspariswomenpowerit

2d2dbdf5d060b4c1bb238f8f59185cfb?s=128

Giulia

June 19, 2021
Tweet

Transcript

  1. @Giuliabianchl @Giuliabianchl #WiDS2021 CHERCHER L’AIGUILLE DANS… LES DONNÉES GIULIA BIANCHI

    - 19/06/2021 1
  2. @Giuliabianchl @Giuliabianchl #WiDS2021 GIULIA BIANCHI BONJOUR ! 🦩 @Giuliabianchl 👩💻

    Senior Data Scientist, CybelAngel 💙 le partage de connaissances 📝🎙 2
  3. @Giuliabianchl @Giuliabianchl #WiDS2021 CLASSIFICATION BINAIRE 3

  4. @Giuliabianchl @Giuliabianchl #WiDS2021 LA CLASSIFICATION BINAIRE CLASSES ÉQUILIBRÉES Données 


    d’entraînement : Modèle ‣ 50 % classe positive ‣ 50 % classe négative 4
  5. @Giuliabianchl @Giuliabianchl #WiDS2021 LA CLASSIFICATION BINAIRE CLASSES ÉQUILIBRÉES Données 


    d’entraînement : Modèle ‣ 2 erreurs Prédictions : ‣ 50 % classe positive ‣ 50 % classe négative 5
  6. @Giuliabianchl @Giuliabianchl #WiDS2021 LA CLASSIFICATION BINAIRE CLASSES ÉQUILIBRÉES - PERFORMANCE

    ‣ 2 erreurs Prédictions : Mesure de performance: ‣ accuracy score accuracy(y, ̂ y) = 1 nsamples nsamples −1 ∑ i=0 1( ̂ yi = yi ) accuracy = 1 10 (0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1) = 0.8 6
  7. @Giuliabianchl @Giuliabianchl #WiDS2021 LA CLASSIFICATION BINAIRE CLASSES DÉSÉQUILIBRÉES Données 


    d’entraînement : Modèle ‣ 10 % classe positive ‣ 90 % classe négative 7
  8. @Giuliabianchl @Giuliabianchl #WiDS2021 LA CLASSIFICATION BINAIRE CLASSES DÉSÉQUILIBRÉES Données 


    d’entraînement : Modèle ‣ 2 erreurs Prédictions : ‣ 10 % classe positive ‣ 90 % classe négative 8
  9. @Giuliabianchl @Giuliabianchl #WiDS2021 LA CLASSIFICATION BINAIRE CLASSES DÉSÉQUILIBRÉES - PERFORMANCE

    ‣ 2 erreurs Prédictions : Mesure de performance: ‣ accuracy score accuracy(y, ̂ y) = 1 nsamples nsamples −1 ∑ i=0 1( ̂ yi = yi ) accuracy = 1 10 (0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0) = 0.8 9
  10. @Giuliabianchl @Giuliabianchl #WiDS2021 LES PERFORMANCES SONT BONNES MAIS LE MODÈLE

    NE SERT À RIEN sympa 🤷 LA CLASSIFICATION BINAIRE AVEC CLASSES DÉSÉQUILIBRÉES 10
  11. @Giuliabianchl @Giuliabianchl #WiDS2021 COMMENT FAIRE ? 11

  12. @Giuliabianchl @Giuliabianchl #WiDS2021 LA CLASSIFICATION BINAIRE AVEC CLASSES DÉSÉQUILIBRÉES SOLUTIONS

    POSSIBLES Actions possibles à différents niveaux : 1. Sur les données 2. Sur l’entraînement 3. Sur l’évaluation 4. Sur la prédiction 12
  13. @Giuliabianchl @Giuliabianchl #WiDS2021 LA CLASSIFICATION BINAIRE AVEC CLASSES DÉSÉQUILIBRÉES SOLUTIONS

    POSSIBLES Actions possibles à différents niveaux : 1. Sur les données 👉 rééquilibrer les classes 2. Sur l’entraînement 👉 modi fi er le poids des classes 3. Sur l’évaluation 👉 utiliser une "bonne" métrique 4. Sur la prédiction 👉 choisir le bon seuil de probabilité 13
  14. @Giuliabianchl @Giuliabianchl #WiDS2021 1. RÉÉQUILIBRER LES CLASSES 14

  15. @Giuliabianchl @Giuliabianchl #WiDS2021 RÉÉQUILIBRER LES CLASSES AJOUTER OU SUPPRIMER DES

    EXEMPLES ? ▸ Hypothèse : on dispose d’un échantillon représentatif 15
  16. @Giuliabianchl @Giuliabianchl #WiDS2021 RÉÉQUILIBRER LES CLASSES AJOUTER OU SUPPRIMER DES

    EXEMPLES ? ▸ Hypothèse : on dispose d’un échantillon représentatif ▸ SMOTE : Ajouter des exemples arti fi ciels à la classe minoritaire 👉 "oversampling" ▸ je ne suis pas fan d’inventer des données ▸ Supprimer des exemples de la class majoritaire 👉 “undersampling" ▸ on perd potentiellement de l’information pertinente 16 imbalanced-learn/over-sampling imbalanced-learn/under-sampling
  17. @Giuliabianchl @Giuliabianchl #WiDS2021 RÉÉQUILIBRER LES CLASSES AJOUTER OU SUPPRIMER DES

    EXEMPLES ? ▸ Hypothèse : on dispose d’un échantillon représentatif ▸ Dans les deux cas je déconseille de modi fi er “trop” la proportion de positifs vs. négatifs ▸ Faire attention à `over fi t` et `subsampling` dans les méthodes d’ensemble et en cross-validation 17
  18. @Giuliabianchl @Giuliabianchl #WiDS2021 2. MODIFIER ARTIFICIELLEMENT LE POIDS DES CLASSES

    PENDANT L ’ENTRAÎNEMENT 18
  19. @Giuliabianchl @Giuliabianchl #WiDS2021 MODIFIER ARTIFICIELLEMENT LE POIDS DES CLASSES PENDANT

    L’ENTRAÎNEMENT PARAMÈTRE “CLASS_WEIGHT” ▸ Techniquement on va modi fi er l’erreur de classi fi cation dans la fonction de coût pendant l’entraînement ▸ log-loss par défaut de la régression logistique ▸ ▸ log-loss modi fi ée ▸ Jθ = − 1 m m ∑ i=1 Yi log Pi + (1 − Yi )log(1 − Pi ) Jθ = − 1 m m ∑ i=1 W0 Yi log Pi +W1 (1 − Yi )log(1 − Pi ) 19 How to Improve Class Imbalance using Class Weights in Machine Learning
  20. @Giuliabianchl @Giuliabianchl #WiDS2021 MODIFIER ARTIFICIELLEMENT LE POIDS DES CLASSES PENDANT

    L’ENTRAÎNEMENT PARAMÈTRE “CLASS_WEIGHT” ▸ Techniquement on va modi fi er l’erreur de classi fi cation dans la fonction de coût pendant l’entraînement ▸ log-loss modi fi ée ▸ ▸ : poids pour la classe majoritaire ▸ : poids pour la classe minoritaire ▸ 👉 ▸ Dans scikit-learn cela correspond au paramètre “class_weight” Jθ = − 1 m m ∑ i=1 W0 Yi log Pi +W1 (1 − Yi )log(1 − Pi ) W0 W1 W1 > W0 20 sklearn - class_weight
  21. @Giuliabianchl @Giuliabianchl #WiDS2021 3. UTILISER UNE MÉTRIQUE D’ÉVALUATION PLUS ADAPTÉE

    21
  22. @Giuliabianchl @Giuliabianchl #WiDS2021 UTILISER UNE MÉTRIQUE D’ÉVALUATION PLUS ADAPTÉE PÉNALISER

    LES ERREURS SUR LA CLASSE MINORITAIRE ▸ La courbe ROC ▸ dans le cas idéal la TPR=1 et la FPR=0 ▸ 👉 maximiser les TP (et les TN) ▸ 👉 minimiser les FN et les FP ▸ Avec classes déséquilibrées 
 les TN sont “naturellement" 
 élevés et les FP bas FPR = FP FP + TN TPR = TP TP + FN 22 Receiver operating characteristic
  23. @Giuliabianchl @Giuliabianchl #WiDS2021 UTILISER UNE MÉTRIQUE D’ÉVALUATION PLUS ADAPTÉE FPR

    & TPR - CLASSES ÉQUILIBRÉES ‣ 2 erreurs Prédictions : Mesure de performance: FPR = FP FP + TN = 1 1 + 4 = 0.2 TPR = TP TP + FN = 4 4 + 1 = 0.8 accuracy = 0.8 23
  24. @Giuliabianchl @Giuliabianchl #WiDS2021 UTILISER UNE MÉTRIQUE D’ÉVALUATION PLUS ADAPTÉE FPR

    & TPR - CLASSES DÉSÉQUILIBRÉES ‣ 2 erreurs Prédictions : Mesure de performance: FPR = FP FP + TN = 1 1 + 8 = 0.11 TPR = TP TP + FN = 0 0 + 1 = 0 accuracy = 0.8 24 ⚠ ✔ ✔
  25. @Giuliabianchl @Giuliabianchl #WiDS2021 UTILISER UNE MÉTRIQUE D’ÉVALUATION PLUS ADAPTÉE PÉNALISER

    LES ERREURS SUR LA CLASSE MINORITAIRE ▸ La courbe Precision-Recall ▸ dans le cas idéal la précision=1 et le rappel=1 ▸ 👉 maximiser les TP ▸ 👉 minimiser les FN et les FP ▸ Avec classes déséquilibrées les 
 TN sont “naturellement” élevés 
 et les FP bas 👉 on sort les TN Precision = TP TP + FP Recall = TP TP + FN 25
  26. @Giuliabianchl @Giuliabianchl #WiDS2021 UTILISER UNE MÉTRIQUE D’ÉVALUATION PLUS ADAPTÉE PRECISION

    & RECALL - CLASSES ÉQUILIBRÉES ‣ 2 erreurs Prédictions : Mesure de performance: accuracy = 0.8 Precision = TP TP + FP = 4 4 + 1 = 0.8 Recall = TP TP + FN = 4 4 + 1 = 0.8 26
  27. @Giuliabianchl @Giuliabianchl #WiDS2021 UTILISER UNE MÉTRIQUE D’ÉVALUATION PLUS ADAPTÉE PRECISION

    & RECALL - CLASSES DÉSÉQUILIBRÉES ‣ 2 erreurs Prédictions : Mesure de performance: Precision = TP TP + FP = 0 0 + 1 = 0 Recall = TP TP + FN = 0 0 + 1 = 0 accuracy = 0.8 27 ⚠ ⚠ ✔
  28. @Giuliabianchl @Giuliabianchl #WiDS2021 4. JONGLER AVEC LE SEUIL DE PROBABILITÉ

    28
  29. @Giuliabianchl @Giuliabianchl #WiDS2021 JONGLER AVEC LE SEUIL DE PROBABILITÉ PREDICT

    VS. PREDICT_PROBA ▸ `predict_proba` fournit un score ▸ il varie entre 0 et 1 ▸ selon le modèle il peut correspondre à une probabilité ▸ `predict` fournit une classe ▸ positive ( ) ▸ négative ( ) score ≥ 0.5 score < 0.5 29
  30. @Giuliabianchl @Giuliabianchl #WiDS2021 JONGLER AVEC LE SEUIL DE PROBABILITÉ PREDICT

    VS. PREDICT_PROBA ▸ `predict_proba` fournit un score ▸ s’il est bien calibré, il représente la proportion de cas positifs ▸ `predict` fournit une classe (tranchant à 0.5) ▸ c’est peu adapté aux classes déséquilibrées où la proportion des positifs est inférieure à 50% ▸ 👉 on peut choisir un seuil qui convient mieux que 0.5 30
  31. @Giuliabianchl @Giuliabianchl #WiDS2021 JONGLER AVEC LE SEUIL DE PROBABILITÉ COMMENT

    CHOISIR LE SEUIL ? ▸ Selon le seuil choisi, toutes les métriques calculées sur la base de la matrice de contingence changent ! ▸ p.d.v. quantitatif : ▸ la courbe roc et precision-recall, 
 precision-recall vs. seuil ▸ p.d.v. qualitatif : selon le cas d'usage ▸ C’est quoi le plus important ? 
 (ou le moins grave) ? 31 Precision and Recall
  32. @Giuliabianchl @Giuliabianchl #WiDS2021 JONGLER AVEC LE SEUIL DE PROBABILITÉ COMMENT

    CHOISIR LE SEUIL ? ▸ p.d.v. qualitatif : selon le cas d'usage ▸ C’est quoi le plus important ? (ou le moins grave) ? 32 Statistical Performance Measure
  33. @Giuliabianchl @Giuliabianchl #WiDS2021 EXEMPLE & CONCLUSION 33

  34. @Giuliabianchl @Giuliabianchl #WiDS2021 CLASSE POSITIVE: ~25%, CLASSE NÉGATIVE: ~75% PIPELINE

    GÉNÉRIQUE count_vectorizer = CountVectorizer( 
 strip_accents="ascii", 
 lowercase=True, 
 stop_words="english", 
 ngram_range=(1, 3), 
 max_features=500, 
 min_df=.01, 
 max_df=.90 
 ) tfidf_transformer = TfidfTransformer() model = <MODEL> pipeline = Pipeline([ 
 ('vect', count_vectorizer), 
 ('tfidf', tfidf_transformer), 
 ('clf', model) 
 ]) pipeline = pipeline.fit(X_train, y_train) predicted_probabilities = pipeline.predict_proba(X_test) pos_th = <THRESHOLD> predicted_classes = np.array([True if i[-1]>=pos_th else False for i in predicted_probabilities]) [precision, recall, f1, support] = precision_recall_fscore_support(y_test, predicted_classes) acc = accuracy_score(y_test, predicted_classes) perf = { 
 "accuracy score": round(acc, 2), 
 "precision": round(precision[-1], 2), 
 "recall": round(recall[-1], 2) 
 } 34 Kaggle - Random acts of pizza
  35. @Giuliabianchl @Giuliabianchl #WiDS2021 CLASSE POSITIVE: ~25%, CLASSE NÉGATIVE: ~75% COMPARAISON

    DE RÉSULTATS <MODEL> <THRESHOLD> accuracy precision recall FPR MultinomialNB() 0.5 0.75 0.5 0.01 0.003 MultinomialNB() 0.246 0.59 0.3 0.5 0.38 LogisticRegression() 0.5 0.76 0.58 0.06 0.01 LogisticRegression( 
 class_weight=“balanced" 
 ) 0.5 0.63 0.35 0.57 0.35 35
  36. @Giuliabianchl @Giuliabianchl #WiDS2021 CLASSE POSITIVE: ~25%, CLASSE NÉGATIVE: ~75% COMPARAISON

    DE RÉSULTATS 36
  37. @Giuliabianchl @Giuliabianchl #WiDS2021 CLASSE POSITIVE: ~25%, CLASSE NÉGATIVE: ~75% COMPARAISON

    DE RÉSULTATS 37
  38. @Giuliabianchl @Giuliabianchl #WiDS2021 TEXT CONCLUSION ▸ (Collectez les bonnes données

    et construisez les bonnes features) ▸ Faites attention au performances trop optimistes et à l’over fi t ▸ Testez les solutions techniques qui apportent les meilleurs résultats dans votre cas d’usage 👉 interpreter vos résultats ▸ Enjoy the ride 🚀 38
  39. @Giuliabianchl @Giuliabianchl #WiDS2021 MERCI ! Vous trouverez ces slides sur

    Speaker Deck 👩💻 C’EST TOUT 39