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.
Vous devez vous connecter pour publier un commentaire.
(1)C'est ok pour utiliser votre stratégie. Je travaille avec le déséquilibre des données ainsi que j'essaie de l'utilisation de sous-échantillonnage et les méthodes d'échantillonnage premier à faire le jeu de la formation même distribué. Ou à l'aide de l'ensemble de la méthode pour former chaque classificateur avec un même distribuée sous-ensemble.
(2)je n'ai pas vu une méthode pour optimiser l'AUROC. Ma pensée est que AUROC est basée sur la nature positive de taux et de taux de faux positifs, ce qui ne veut pas dire la façon dont il fonctionne sur chaque instance. Ainsi, il n'est pas nécessairement de maximiser la capacité à séparer les classes.
(3)Concernant la pondération des coûts par le rapport d'instances de la classe, il semblable à La perte de fonction de classe déséquilibrée binaire classificateur en Tenseur de flux de
et la réponse.
Concernant le déséquilibre des ensembles de données, les deux premières méthodes qui viennent à l'esprit sont (upweighting échantillons positifs, l'échantillonnage à réaliser l'équilibre lot de distributions).
Upweighting échantillons positifs
Cela se réfère à l'augmentation de la perte de classement échantillons positifs lors de la formation sur les ensembles de données qui ont beaucoup moins d'échantillons positifs. Cela stimule la ML algorithme pour apprendre les paramètres qui sont les meilleurs pour les échantillons positifs. Pour la classification binaire, il y a une API simple dans tensorflow qui permet d'obtenir cette. Voir (weighted_cross_entropy) référencées ci-dessous
Lot D'Échantillonnage
Cela implique d'échantillonnage de l'ensemble de données afin que chaque lot de données d'entraînement a une même distribution d'échantillons positifs pour les échantillons négatifs. Cela peut être fait en utilisant les rejets d'échantillonnage de l'API fournie à partir de tensorflow.
Je suis celui qui luttent avec déséquilibre de données. Quelle est ma stratégie pour contrer déséquilibre des données sont comme ci-dessous.
1) le coût de l'Utilisation de la fonction de calcul de 0 et de 1 étiquettes en même temps, comme ci-dessous.
2) Utiliser la FRAPPA, suréchantillonnage méthode de prise de nombre de 0 et de 1 étiquettes semblables. Reportez-vous ici, http://comments.gmane.org/gmane.comp.python.scikit-learn/5278
À la fois la stratégie a fonctionné quand j'ai essayé de faire de la cote de crédit de modèle.
La régression logistique est une méthode classique pour gérer déséquilibre de données et de classification binaire tels que la prédiction du taux de défaillance. AUROC est l'un des meilleur indicateur de compteur de déséquilibre de données.
1) Oui. C'est bien reçu stratégie pour contrer déséquilibre de données. Mais cette stratégie est la bonne dans les réseaux de Neurones uniquement si vous utilisez SGD.
Un autre moyen facile d'équilibrer les données d'apprentissage à l'aide pondérée des exemples. Juste amplifier le par exemple la perte d'un plus grand poids/taille inférieure à voir déséquilibre des exemples. Si vous utilisez en ligne de descente de gradient, il peut être aussi simple que d'utiliser un plus grand/plus petit au taux d'apprentissage en voyant déséquilibre des exemples.
Pas sûr à ce sujet 2.