Formation sur les données déséquilibrées en utilisant TensorFlow

La Situation:

je me demande comment utiliser TensorFlow de manière optimale lorsque mes données de formation sont déséquilibrées dans la distribution des étiquettes entre deux étiquettes. Par exemple, supposons que le tutoriel MNIST soit simplifié pour distinguer seulement entre 1 et 0, où toutes les images disponibles sont soit 1 ou 0. Cela est facile à former en utilisant les tutoriels TensorFlow fournis lorsque nous avons environ 50% de chaque type de l'image de l'apprentissage et le test. Mais quid du cas où 90% des images disponibles dans nos données sont 0 et 10% seulement sont de 1? J'observe que dans ce cas, TensorFlow prédit systématiquement que mon test entier est 0, obtenant une précision de 90% sans signification.

une stratégie que j'ai utilisée avec un certain succès est de choisir des lots aléatoires pour la formation qui ont une distribution égale de 0 et de 1. Cette approche garantit que je peux toujours utiliser toutes mes données de formation et produit résultats décents, avec moins de 90% de précision, mais un classificateur beaucoup plus utile. Puisque la précision est quelque peu inutile pour moi dans ce cas, ma métrique de choix est typiquement l'aire sous la courbe de ROC (AUROC), et cela produit un résultat respectablement plus élevé que .50.

Questions:

(1) la stratégie que j'ai décrite constitue-t-elle une méthode acceptée ou optimale de formation sur les données déséquilibrées, ou y en a-t-il une qui pourrait mieux fonctionner?

(2) puisque la mesure de précision n'est pas aussi utile dans le cas de données déséquilibrées, y a-t-il une autre mesure qui peut être maximisée en modifiant la fonction de coût? Je peux certainement calculer AUROC post-formation, mais puis-je m'entraîner de manière à maximiser 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 pondérant à la hausse le coût d'une mauvaise catégorisation de la classe d'étiquettes plus petite, mais je ne sais pas comment faire.

21
demandé sur MJoseph 2016-01-28 01:30:20

4 réponses

(1) Il est correct d'utiliser votre stratégie. Je travaille également avec des données déséquilibrées, que j'essaie d'utiliser des méthodes d'échantillonnage à la baisse et à la hausse d'abord pour rendre l'ensemble de formation même distribué. Ou en utilisant la méthode d'ensemble pour former chaque Classificateur avec un sous-ensemble même distribué.

(2)Je n'ai vu aucune méthode pour maximiser L'AUROC. Ma pensée est QU'AUROC est basé sur le taux de Turn positif et le taux de false positif, qui ne dit pas comment bien il fonctionne sur chaque instance. Ainsi, elle ne maximise pas nécessairement 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, il similaire à fonction de perte pour classe déséquilibré Classificateur binaire dans le flux de tenseur et la réponse.

6
répondu Young 2017-05-23 12:10:35

je suis celui qui lutte avec des données déséquilibrées. Ce que ma stratégie pour contrer les données déséquilibrées sont comme ci-dessous.

1) Utilisez la fonction de coût calculant 0 et 1 étiquettes 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, méthode de suréchantillonnage faisant nombre d'étiquettes 0 et 1 similaire. Voir ici, http://comments.gmane.org/gmane.comp.python.scikit-learn/5278

les deux stratégies ont fonctionné quand je essayé de faire de la cote de crédit de modèle.

régression logistique est une méthode typique pour traiter les données déséquilibrées et la classification binaire tels que la prévision du taux par défaut. AUROC est l'une des meilleures mesures pour contrer les données déséquilibrées.

4
répondu Byeonggeon Ko 2016-05-15 13:53:19

1) Oui. Il s'agit d'une stratégie bien accueillie pour contrer les données déséquilibrées. Mais cette stratégie est bonne dans les réseaux neuronaux seulement si vous utilisez la SGD.

une autre façon facile d'équilibrer les données sur la formation est d'utiliser des exemples pondérés. Il suffit d'amplifier la perte par instance d'un poids plus grand/plus petit en voyant des exemples déséquilibrés. Si vous utilisez la descente par gradient en ligne, cela peut être aussi simple que d'utiliser un taux d'apprentissage plus ou moins grand lorsque vous voyez des exemples déséquilibrés.

Pas sûr à ce sujet 2.

2
répondu Farseer 2016-01-27 23:28:08

en ce qui concerne les ensembles de données déséquilibrés, les deux premières méthodes qui viennent à l'esprit sont (pondération des échantillons positifs, échantillonnage pour obtenir des distributions par lots équilibrées).

Upweighting échantillons positifs Il s'agit d'augmenter les pertes d'échantillons positifs mal classés lors de la formation sur des ensembles de données qui ont beaucoup moins d'échantillons positifs. Cela incite L'algorithme ML à apprendre des paramètres qui sont meilleurs pour les échantillons positifs. Pour les binaires la classification, il y a une API simple dans tensorflow qui réalise ceci. Voir (weighted_cross_entropy) référencé ci-dessous

Échantillonnage Par Lots Il s'agit d'échantillonner l'ensemble de données de façon à ce que chaque lot de données de formation ait une distribution uniforme d'échantillons positifs à négatifs. Cela peut être fait en utilisant L'API d'échantillonnage de rejets fournie par tensorflow.

2
répondu Convergii 2018-01-15 19:43:44