web-dev-qa-db-fra.com

Comment puis-je assigner un poids de classe dans Keras d'une manière simple?

quelqu'un peut-il me dire quel est le moyen le plus simple d'appliquer class_weight à Keras lorsque l'ensemble de données est déséquilibré, s'il vous plaît.

Je n'ai que deux classes dans ma cible.

Merci

5
Javi

Utilisation de class_weight dans le kit sklearn.

J'utilise aussi cette méthode pour traiter les données de déséquilibre

from sklearn.utils import class_weight
class_weight = class_weight.compute_class_weight('balanced'
                                               ,np.unique(Y_train)
                                               ,Y_train)

alors model.fit

Classifier.fit(train_X,train_Y,batch_size = 100, epochs = 10
           ,validation_data= (test_X,test_Y),class_weight = class_weight )
6
Johnny Hsieh

Le paramètre class_weight de la fonction fit() est un dictionnaire mappant les classes sur une valeur de pondération. 

Disons que vous avez 500 échantillons de classe 0 et 1500 échantillons de classe 1 que vous alimentez dans class_weight = {0: 3, 1: 1}. Cela donne à la classe 0 trois fois le poids de la classe 1.

train_generator.classes vous donne les noms de classe appropriés pour votre pondération.

Si vous voulez calculer cela par programme, vous pouvez utiliser sklearn.utils.compute_class_weight () de scikit-learn.

La fonction examine la distribution des étiquettes et produit des poids pour pénaliser de manière égale les classes sous-représentées ou surreprésentées dans l'ensemble d'apprentissage.

Voir aussi ce fil utile ici: https://github.com/fchollet/keras/issues/1875

Et ce fil pourrait aussi être utile: Est-il possible de déduire automatiquement le poids_local_faire de flow_from_directory dans Keras?

6
petezurich

Demandez-vous quelle est la bonne pondération à appliquer ou comment faire cela dans le code? Le code est simple:

class_weights = {}
    for i in range(2):
        class_weights[i] = your_weight

et ensuite vous passez l'argument class_weight=class_weights dans model.fit

La bonne pondération à utiliser serait une sorte de fréquence inverse; vous pouvez également faire quelques essais et erreurs.

1
Michele Tonutti