Je sais qu'il existe une possibilité dans Keras avec le class_weights
dictionnaire de paramètres lors de l'ajustement, mais je n'ai trouvé aucun exemple. Quelqu'un aurait-il la gentillesse d'en fournir un?
À propos, dans ce cas, la pratique appropriée consiste simplement à pondérer la classe minoritaire proportionnellement à sa sous-représentation.
classification
keras
weighted-data
Hendrik
la source
la source
Réponses:
Si vous parlez du cas normal, où votre réseau ne produit qu'une sortie, alors votre hypothèse est correcte. Afin de forcer votre algorithme à traiter chaque instance de la classe 1 comme 50 instances de la classe 0, vous devez:
Définir un dictionnaire avec vos étiquettes et leurs poids associés
Introduisez le dictionnaire comme paramètre:
EDIT: "traiter chaque instance de la classe 1 comme 50 instances de la classe 0 " signifie que, dans votre fonction de perte, vous affectez une valeur plus élevée à ces instances. Par conséquent, la perte devient une moyenne pondérée, où le poids de chaque échantillon est spécifié par classe_weight et sa classe correspondante.
De Keras docs: class_weight : index facultatif de mappage de dictionnaire (entiers) sur une valeur de poids (float), utilisé pour pondérer la fonction de perte (uniquement pendant l'entraînement).
la source
Vous pouvez simplement implémenter le
class_weight
desklearn
:Importons d'abord le module
Pour calculer le poids de la classe, procédez comme suit:
Troisièmement et enfin l'ajouter à l'ajustement du modèle
Attention : J'ai édité ce post et changé le nom de la variable class_weight en class_weight s afin de ne pas écraser le module importé. Ajustez en conséquence lors de la copie du code à partir des commentaires.
la source
class_weight.compute_class_weight
produit un tableau, je dois le changer en dict pour pouvoir travailler avec Keras. Plus précisément, après l'étape 2, utilisezclass_weight_dict = dict(enumerate(class_weight))
y_train
c'est(300096, 3)
numpy array. Donc, laclass_weight=
ligne me donne TypeError: type inshashable: 'numpy.ndarray'y_ints = [y.argmax() for y in y_train]
.J'utilise ce genre de règle pour
class_weight
:math.log
lisse les poids pour les classes très déséquilibrées! Cela retourne:la source
n_total_samples / n_class_samples
pour chaque classe.NOTE: Voir les commentaires, cette réponse est obsolète.
Pour pondérer équitablement toutes les classes, vous pouvez maintenant simplement définir class_weight sur "auto" comme suit:
la source
class_weight='auto'
dans la documentation de Keras ni dans le code source. Pouvez-vous nous montrer où vous avez trouvé cela?class_weight
sans effet. Cette réponse n'est donc pas correcte.class_weight c'est bien, mais comme @Aalok l'a dit, cela ne fonctionnera pas si vous encodez des classes multilabel à chaud. Dans ce cas, utilisez sample_weight :
sample_weights est utilisé pour fournir un poids pour chaque échantillon d'apprentissage . Cela signifie que vous devez passer un tableau 1D avec le même nombre d'éléments que vos échantillons d'apprentissage (en indiquant le poids de chacun de ces échantillons).
class_weights est utilisé pour fournir un poids ou un biais pour chaque classe de sortie . Cela signifie que vous devez attribuer une pondération à chaque classe que vous essayez de classer.
sample_weight doit recevoir un tableau numpy, car sa forme sera évaluée.
Voir aussi cette réponse: https://stackoverflow.com/questions/48315094/using-sample-weight-in-keras-for-sequence-labelling
la source
Ajout à la solution à l' adresse https://github.com/keras-team/keras/issues/2115 . Si vous avez besoin de plus que la pondération de classe, vous souhaitez des coûts différents pour les faux positifs et les faux négatifs. Avec la nouvelle version de keras, vous pouvez maintenant remplacer la fonction de perte respective indiquée ci-dessous. Notez que
weights
c'est une matrice carrée.la source
J'ai trouvé l'exemple suivant de codage des poids de classe dans la fonction de perte à l'aide du jeu de données minist. Voir le lien ici: https://github.com/keras-team/keras/issues/2115
la source
Cela fonctionne avec un générateur ou une norme. Votre classe la plus grande aura un poids de 1 tandis que les autres auront des valeurs supérieures à 1 par rapport à la classe la plus grande.
les poids de classe acceptent une entrée de type dictionnaire
la source