Keras: classe de poids (class_weight) pour un chaud encodage
Je voudrais utiliser class_weight argument en keras modèle.aptes à gérer le déséquilibre des données d'entraînement. En regardant certains documents, j'ai compris que nous pouvons passer d'un dictionnaire comme ceci:
class_weight = {0 : 1,
1: 1,
2: 5}
(Dans cet exemple, la classe 2 est plus élevé peine de la perte de fonction.)
Le problème est que mon réseau de sortie a un chaud encodage c'est à dire la classe-0 = (1, 0, 0), classe-1 = (0, 1, 0), et la classe-3 = (0, 0, 1).
Comment pouvons-nous utiliser la class_weight pour une chaude de sortie encodé?
En regardant certains codes dans Keras, il ressemble à _feed_output_names
contiennent une liste de sortie des classes, mais dans mon cas, model.output_names
/model._feed_output_names
retourne ['dense_1']
Connexes: Comment définir la classe de poids pour le déséquilibre des classes dans Keras?
OriginalL'auteur Naoto Usuyama | 2017-04-18
Vous devez vous connecter pour publier un commentaire.
Voici une solution qui est un peu plus court et plus rapide. Si votre "one-hot" codée y est un np.tableau:
d_class_weights
peut ensuite être transmis àclass_weight
dans.fit
.class_weight
comme un tableau numpy sans convertir dictionnaire travaillé dans lemodel.fit()
fonction.l'envoi de la classe de poids de ne pas travailler pour un chaud codé,
elif isinstance(class_weight, dict): ... else: return np.ones((y.shape[0],), dtype=K.floatx())
Vous devez fournir avec des exemples de poids, par exempleclass_weight.compute_sample_weight('balanced', y_train)
à l'aide de sklearnOriginalL'auteur Melissa
Un peu alambiquée de réponse, mais la meilleure que j'ai trouvé jusqu'à présent. Cela suppose de vos données est un chaud codé, multi-classe, et en travaillant uniquement sur les étiquettes DataFrame
df_y
:Il en résulte une
sample_weights
vecteur calculé à l'équilibre d'un déséquilibre de jeu de données qui peuvent être transmises à l'Kerassample_weight
de la propriété, et unclass_weights_dict
qui peut être nourri à la Kerasclass_weight
propriété dans le.fit
méthode. Vous n'avez pas vraiment envie de les utiliser tous les deux, il suffit de choisir un. Je suis en utilisantclass_weight
dès maintenant, parce que c'est compliqué à obtenirsample_weight
de travail avecfit_generator
.class_weight
comme un tableau numpy sans convertir dictionnaire travaillé dans lemodel.fit()
fonction.OriginalL'auteur tw0000
Je crois que l'on peut utiliser
sample_weights
à la place. À l'intérieur de Keras, en fait,class_weights
sont convertis àsample_weights
.https://github.com/fchollet/keras/blob/d89afdfd82e6e27b850d910890f4a4059ddea331/keras/engine/training.py#L1392
Malheureusement, il ne fonctionne pas avec
fit_generator
OriginalL'auteur Naoto Usuyama
dans
_standardize_weights
, keras n':donc, fondamentalement, si vous choisissez d'utiliser un chaud de l'encodage, les classes sont de l'index de colonne.
Vous pouvez aussi demander à vous-même comment vous pouvez mapper la colonne de l'index pour les classes d'origine de vos données.
Eh bien, si vous utilisez le LabelEncoder classe de scikit apprendre à effectuer des "one-hot" de l'encodage, la colonne de l'index des cartes l'ordre de la
unique labels
calculée par la.fit
fonction.Le doc a dit
Exemple:
En conclusion, les clés de la
class_weights
dictionnaire devrait refléter l'ordre dans leclasses_
attribut de l'encodeur.OriginalL'auteur pglaser