La formation sur le déséquilibre des données à l'aide de TensorFlow

La Situation:

Je me demande comment l'utiliser TensorFlow de manière optimale lors de ma formation de données est déséquilibré dans l'étiquette de distribution entre 2 étiquettes. Par exemple, supposons que la MNIST tutoriel est simplifié à distinguer entre les 1 et les 0, où toutes les images disponibles sont, soit 1 ou 0. C'est simple pour vous entraîner en utilisant la condition TensorFlow tutoriels lorsque nous avons à peu près 50% de chaque type d'image pour la formation et le test sur. 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 régulièrement prédit l'ensemble de mon jeu de test à 0, la réalisation d'une précision d'un sens de 90%.

Une stratégie que j'ai utilisée pour un certain succès, c'est de choisir aléatoire des lots pour la formation des qui ont une distribution uniforme de 0 et de 1. Cette approche garantit que je peux toujours utiliser l'ensemble de mes données d'entraînement et produit de bons résultats, avec moins de précision de 90%, mais beaucoup plus utile classificateur. Comme la précision est un peu inutile pour moi, dans ce cas, mon métrique de choix est généralement de l'aire sous la courbe ROC (AUROC), ce qui produit un résultat respectable supérieur .50.

Questions:

(1) Est la stratégie que j'ai décrit un acceptées ou de manière optimale de la formation sur le déséquilibre de données, ou est-il un qui pourrait fonctionner mieux?

(2) Puisque la précision métrique n'est pas aussi utile dans le cas de déséquilibre de données, est-il une autre mesure qui peut être optimisée par l'altération de la fonction de coût? Je peux certainement calculer AUROC post-formation, mais je peux les former de manière à maximiser l'AUROC?

(3) Est-il un autre altération que je peux apporter à ma fonction de coût pour améliorer mes résultats pour le déséquilibre de données? Actuellement, je suis en utilisant une valeur par défaut suggestion donnée dans TensorFlow tutoriels:

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 cela peut être possible en pondérant le coût de miscategorizing la plus petite étiquette de la classe, mais je ne suis pas sûr de la façon de faire.

  • Avez-vous résolu votre problème? J'ai un problème similaire et je suis actuellement à l'essai avec une) d'Abandon de 50% à hidden1, b) la régularisation L2 à perte, et c) de retirer le plus éminent de 90% de la classe et le calcul des 10% réparti uniformément classes.
  • Je n'ai jamais trouvé une meilleure solution que la prise aléatoire des lots. Pour plus de commodité, j'ai fini par abandonner les réseaux de neurones complètement en faveur des arbres, les méthodes de mise en œuvre de scikit-learn. Ici, il y a built-in cross-validation des méthodes qui permettent d'optimiser la sur AUROC qui résout le problème de déséquilibre magnifiquement. Ils ont aussi beaucoup plus rapide que TensorFlow depuis j'ai beaucoup de Cpu, mais pas de GPU.
InformationsquelleAutor MJoseph | 2016-01-27