web-dev-qa-db-fra.com

Formation sur les données déséquilibrées avec TensorFlow

La situation:

Je me demande comment utiliser TensorFlow de manière optimale lorsque mes données d'entraînement sont déséquilibrées dans la distribution des étiquettes entre 2 étiquettes. Par exemple, supposons que le tutoriel MNIST est simplifié pour ne distinguer que les 1 et les 0, où toutes les images disponibles sont soit des 1 soit des 0. Il est simple de s'entraîner à l'aide des didacticiels TensorFlow fournis lorsque nous avons environ 50% de chaque type d'image à former et à tester. Mais qu'en est-il du cas où 90% des images disponibles dans nos données sont des 0 et seulement 10% sont des 1? J'observe que dans ce cas, TensorFlow prédit régulièrement que l'ensemble de mes tests est égal à 0, atteignant une précision de 90% sans signification.

Une stratégie que j'ai utilisée pour réussir est de choisir des lots aléatoires pour la formation qui ont une distribution uniforme de 0 et de 1. Cette approche garantit que je peux toujours utiliser toutes mes données d'entraînement et produire des résultats décents, avec une précision inférieure à 90%, mais un classificateur beaucoup plus utile. Étant donné que la précision m'est quelque peu inutile dans ce cas, ma métrique de choix est généralement l'aire sous la courbe ROC (AUROC), et cela produit un résultat sensiblement supérieur à 0,50.

Questions:

(1) La stratégie que j'ai décrite est-elle un moyen accepté ou optimal de formation sur les données déséquilibrées, ou en existe-t-il une qui pourrait mieux fonctionner?

(2) Étant donné que la métrique de précision n'est pas aussi utile dans le cas de données déséquilibrées, existe-t-il une autre métrique qui peut être maximisée en modifiant la fonction de coût? Je peux certainement calculer l'AUROC après la formation, mais puis-je m'entraîner de manière à maximiser l'AUROC?

(3) Y a-t-il une autre modification que je peux apporter à ma fonction de coût pour améliorer mes résultats pour les données déséquilibrées? Actuellement, j'utilise une suggestion par défaut donnée dans les tutoriels TensorFlow:

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred, y))
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)

J'ai entendu dire que cela pourrait être possible en augmentant le coût de la mauvaise classification de la classe d'étiquettes plus petite, mais je ne sais pas comment procéder.

26
MJoseph

(1) Vous pouvez utiliser votre stratégie. Je travaille également avec des données déséquilibrées, que j'essaie d'abord d'utiliser des méthodes de sous-échantillonnage et de sur-échantillonnage pour que l'ensemble de formation soit même distribué. Ou en utilisant la méthode d'ensemble pour former chaque classificateur avec un sous-ensemble distribué égal.

(2) Je n'ai vu aucune méthode pour maximiser l'AUROC. Je pense que l'AUROC est basé sur un taux positif et un taux de faux positifs, ce qui ne dit pas à quel point cela fonctionne dans chaque cas. Ainsi, il ne peut pas nécessairement maximiser la capacité de séparer les classes.

(3) En ce qui concerne la pondération du coût par le rapport des instances de classe, elle est similaire à fonction de perte pour le classificateur binaire déséquilibré de classe dans le flux de tenseur et la réponse.

7
Young

Concernant les jeux de données déséquilibrés, les deux premières méthodes qui me viennent à l'esprit sont (la surpondération des échantillons positifs, l'échantillonnage pour obtenir des distributions de lots équilibrées).

Surpondération des échantillons positifs Cela fait référence à l'augmentation des pertes d'échantillons positifs mal classés lors de la formation sur des ensembles de données qui contiennent beaucoup moins d'échantillons positifs. Cela incite l'algorithme ML à apprendre des paramètres meilleurs pour les échantillons positifs. Pour la classification binaire, il existe une API simple dans tensorflow qui y parvient. Voir (weighted_cross_entropy) référencé ci-dessous

Échantillonnage par lots Cela implique l'échantillonnage de l'ensemble de données de sorte que chaque lot de données d'apprentissage ait une distribution uniforme des échantillons positifs aux échantillons négatifs. Cela peut être fait en utilisant l'API d'échantillonnage des rejets fournie par tensorflow.

5
Convergii

Je suis celui qui lutte avec des données déséquilibrées. Voici ma stratégie pour contrer les données déséquilibrées.

1) Utilisez la fonction de coût en calculant les étiquettes 0 et 1 en même temps comme ci-dessous.

cost = tf.reduce_mean(-tf.reduce_sum(y*tf.log(_pred) + (1-y)*tf.log(1-_pred), reduction_indices=1))

2) Utilisez SMOTE, une méthode de suréchantillonnage rendant le nombre d'étiquettes 0 et 1 similaires. Reportez-vous ici, http://comments.gmane.org/gmane.comp.python.scikit-learn/5278

Les deux stratégies ont fonctionné lorsque j'ai essayé de créer un modèle de notation de crédit.

La régression logistique est une méthode typique pour gérer les données déséquilibrées et la classification binaire comme la prédiction du taux de défaut. L'AUROC est l'une des meilleures mesures pour contrer les données déséquilibrées.

4
Byeonggeon Ko

1) Oui. C'est une stratégie bien reçue pour contrer les données déséquilibrées. Mais cette stratégie n'est bonne dans les réseaux neuronaux que si vous utilisez SGD.

Un autre moyen simple d'équilibrer les données d'entraînement est d'utiliser des exemples pondérés. Amplifiez simplement la perte par instance d'un poids plus important/plus petit lorsque vous voyez des exemples déséquilibrés. Si vous utilisez la descente de gradient en ligne, cela peut être aussi simple que d'utiliser un taux d'apprentissage plus grand/plus petit lorsque vous voyez des exemples déséquilibrés.

Je ne sais pas 2.

2
Farseer