Avec une classe déséquilibrée, dois-je utiliser le sous-échantillonnage sur mes jeux de données de validation / test?

13

Je suis un débutant en apprentissage automatique et je suis confronté à une situation. Je travaille sur un problème d'enchères en temps réel, avec l'ensemble de données IPinYou et j'essaie de faire une prédiction de clic.

Le fait est que, comme vous le savez peut-être, l'ensemble de données est très déséquilibré: environ 1300 exemples négatifs (sans clic) pour 1 exemple positif (clic).

C'est ce que je fais:

  1. Charger les données
  2. Divisez l'ensemble de données en 3 ensembles de données: A = formation (60%) B = validation (20%) C = test (20%)
  3. Pour chaque ensemble de données (A, B, C), faites un sous-échantillonnage sur chaque classe négative afin d'avoir un ratio de 5 (5 exemples négatifs pour 1 exemple positif). Cela me donne 3 nouveaux jeux de données qui sont plus équilibrés: A 'B' C '

Ensuite, je forme mon modèle avec l'ensemble de données A 'et la régression logistique.

Ma question est:

  1. Quel ensemble de données dois-je utiliser pour la validation? B ou B '?

  2. Quel ensemble de données dois-je utiliser pour les tests? C ou C '

  3. Quelles mesures sont les plus pertinentes pour évaluer mon modèle? F1Score semble être une métrique bien utilisée. Mais ici, en raison de la classe déséquilibrée (si j'utilise les ensembles de données B et C), la précision est faible (inférieure à 0,20) et le F1Score est très influencé par un faible rappel / précision. Serait-il plus précis d'utiliser aucPR ou aucROC?

  4. Si je veux tracer la courbe d'apprentissage, quelles mesures dois-je utiliser? (sachant que l'erreur% n'est pas pertinente si j'utilise l'ensemble de données B pour valider)

Merci d'avance pour votre temps !

Cordialement.

jmvllt
la source

Réponses:

9

Grande question ... Voici quelques réponses spécifiques à vos questions numérotées:

1)Vous devez effectuer une validation croisée sur B et non sur B`. Sinon, vous ne saurez pas à quel point votre équilibrage de classe fonctionne. Cela ne pouvait pas nuire à la validation croisée à la fois sur B et B` et sera utile en fonction de la réponse à 4 ci-dessous.

2) Vous devez tester à la fois C et C` sur la base de 4 ci-dessous.

3)Je m'en tenir à F1 et il pourrait être utile d'utiliser ROC-AUC et cela fournit un bon contrôle de santé mentale. Les deux ont tendance à être utiles avec des classes déséquilibrées.

4)Cela devient vraiment délicat. Le problème avec cela est que la meilleure méthode nécessite que vous réinterprétiez à quoi devraient ressembler les courbes d'apprentissage ou que vous utilisiez à la fois les ensembles de données rééchantillonnés et d'origine.

L'interprétation classique des courbes d'apprentissage est la suivante:

  • Overfit - Les lignes ne se rejoignent pas tout à fait;
  • Underfit - Les lignes se rejoignent mais à un score F1 trop bas;
  • Just Right - Les lignes se rejoignent avec un score F1 raisonnable.

Maintenant, si vous vous entraînez sur A` et testez sur C, les lignes ne se rejoindront jamais complètement. Si vous vous entraînez sur A` et testez sur C` les résultats ne seront pas significatifs dans le contexte du problème d'origine. Donc que fais-tu?

La réponse est de s'entraîner sur A` et de tester sur B`, mais aussi de tester sur B. Obtenez le score F1 pour B` où vous voulez qu'il soit, puis vérifiez le score F1 pour B. Ensuite, faites vos tests et générez des courbes d'apprentissage pour C. Les courbes ne se rejoindront jamais, mais vous aurez une idée du biais acceptable ... c'est la différence entre F1 (B) et F1 (B`).

Maintenant, la nouvelle interprétation de vos courbes d'apprentissage est:

  • Overfit - Les lignes ne se rejoignent pas et sont plus éloignées que F1 (B`) -F1 (B);
  • Underfit - Les lignes ne se rejoignent pas mais la différence est inférieure à F1 (B`) -F1 (B) et le score F1 (C) est inférieur à F1 (B);
  • Exactement - les lignes ne se rejoignent pas mais la différence est inférieure à F1 (B`) -F1 (B) avec un score F1 (C) similaire à F1 (B).

Général : Je suggère fortement que pour les classes déséquilibrées, vous essayez d'abord d'ajuster les poids de votre classe dans votre algorithme d'apprentissage au lieu de sur / sous-échantillonner car cela évite toute la rigueur morale que nous avons décrite ci-dessus. C'est très facile dans des bibliothèques comme scikit-learn et assez facile à manipuler du code dans tout ce qui utilise une fonction sigmoïde ou un vote majoritaire.

J'espère que cela t'aides!

AN6U5
la source
Merci beaucoup @ AN605. C'est si gentil de ta part ! J'ai quelques questions: Pour les 4) - Quand vous dites "s'entraîner sur A 'et tester sur B'", voulez-vous dire valider? - «générer des courbes d'apprentissage pour C» et «le score F1 (C) est inférieur / similaire à F1 (B)». Je pensais que, pour la courbe d'apprentissage, nous devions tracer la métrique d'erreur pour l'ensemble d'apprentissage (A ou A 'ici) et la métrique d'erreur pour l'ensemble de validation (B ou B') uniquement. N'êtes-vous pas "valider" sur C ici?
jmvllt
A propos de l'utilisation des "poids de classe", corrigez-moi si je me trompe (je viens de jeter un coup d'œil à ce sujet) mais, cette astuce consiste à "modifier" la fonction de coût en ajoutant un coefficient / poids "k" devant le classe déséquilibrée, non? : 􏲏 Coût (h (x), y) = -y * k * log (h (x)) - (1-y) * log ((h (x)) Comme cela, l'algorithme devrait considérer une classification erronée de la classe positive comme plus importante. Mais le fait est que je "dois" utiliser Apache Spark & ​​MLlib pour construire mon tout modèle. Et je ne suis pas sûr de pouvoir modifier facilement ma fonction de coût avec spark. Quoi qu'il en soit, merci pour votre temps!
jmvllt
5

Pour 1)et 2), vous voulez

1) choose a model that performs well on data distributed as you 
   expect the real data will be 
2) evaluate the model on data distributed the same way

Donc, pour ces jeux de données, vous ne devriez pas avoir besoin d'équilibrer les classes.

Vous pouvez également essayer d'utiliser des pondérations de classe au lieu de sous / suréchantillonnage, car cela prend en charge cette décision pour vous.

Car 3)vous voudrez probablement optimiser en utilisant n'importe quelle métrique sur laquelle vous serez noté (si c'est une compétition). Mais si ce n'est pas une considération, tous ces modèles sont de bons choix. F1 peut être influencé par la faible précision, mais vous voulez que cela soit capturé. C'est précisément lorsque des modèles naïfs (comme deviner la classe majoritaire) peuvent bien marquer par certaines mesures que des scores comme F1 sont pertinents.

Quant à 4)il n'y a rien de mal à afficher la métrique sur laquelle vous finissez par optimiser.

jamesmf
la source
Salut @jamesmf, merci pour cette réponse sympa. Pour le F1Score, le problème que j'ai eu est que je peux vouloir me concentrer davantage sur l'élimination du faux positif plus que du faux négatif. Serait-il juste d'ajouter un «poids» différent pour FP et FN dans le calcul de la précision et du rappel?
jmvllt
Cela me semble logique. Votre description de la pondération de classe est également correcte, et je ne la vois pas implémentée dans MLib, mais cela pourrait valoir la peine d'être demandé
jamesmf
D'accord merci James! J'essaie actuellement de le faire moi-même en étendant la classe LogisticGradient et en écrasant la méthode de calcul. Je vous ferai savoir si cela me donne de bons résultats. Bonne journée.
jmvllt