Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

Giulia

June 19, 2021
Tweet

More Decks by Giulia

Other Decks in Programming

Transcript

  1. @Giuliabianchl @Giuliabianchl #WiDS2021 GIULIA BIANCHI BONJOUR ! 🦩 @Giuliabianchl 👩💻

    Senior Data Scientist, CybelAngel 💙 le partage de connaissances 📝🎙 2
  2. @Giuliabianchl @Giuliabianchl #WiDS2021 LA CLASSIFICATION BINAIRE CLASSES ÉQUILIBRÉES Données 


    d’entraînement : Modèle ‣ 50 % classe positive ‣ 50 % classe négative 4
  3. @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
  4. @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
  5. @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
  6. @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
  7. @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
  8. @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
  9. @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
  10. @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
  11. @Giuliabianchl @Giuliabianchl #WiDS2021 RÉÉQUILIBRER LES CLASSES AJOUTER OU SUPPRIMER DES

    EXEMPLES ? ▸ Hypothèse : on dispose d’un échantillon représentatif 15
  12. @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
  13. @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
  14. @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
  15. @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
  16. @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
  17. @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
  18. @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 ⚠ ✔ ✔
  19. @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
  20. @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
  21. @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 ⚠ ⚠ ✔
  22. @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
  23. @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
  24. @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
  25. @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
  26. @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
  27. @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
  28. @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