web-dev-qa-db-fra.com

Keras - class_weight vs sample_weights dans le fit_generator

Dans Keras (en utilisant TensorFlow comme backend), je construis un modèle qui fonctionne avec un énorme ensemble de données qui a des classes (labels) très déséquilibrées. Pour pouvoir exécuter le processus de formation, j'ai créé un générateur qui alimente des morceaux de données au fit_generator.

Selon la documentation du fit_generator , la sortie du générateur peut être soit le Tuple (inputs, targets) ou le Tuple (inputs, targets, sample_weights). Dans cet esprit, voici quelques questions:

  1. Je crois comprendre que le class_weight concerne les poids de toutes les classes pour l'ensemble de données alors que le sample_weights concerne les poids de toutes les classes pour chaque bloc individuel créé par le générateur. Est-ce exact? Sinon, quelqu'un peut-il développer la question?
  2. Est-il nécessaire de donner à la fois le class_weight à la fit_generator puis le sample_weights comme sortie pour chaque morceau? Si oui, alors pourquoi? Sinon, lequel est préférable de donner?
  3. Si je devais donner le sample_weights pour chaque bloc, comment mapper les poids si certaines classes manquent dans un bloc spécifique? Laissez-moi vous donner un exemple. Dans mon ensemble de données global, j'ai 7 classes (labels) possibles. Parce que ces classes sont très déséquilibrées, lorsque je crée de plus petits morceaux de données en tant que sortie du fit_generator, certaines classes manquent dans le bloc spécifique. Comment créer le sample_weights pour ces morceaux?
12
RaduS

Ma compréhension est que le poids_classe concerne les poids de toutes les classes pour l'ensemble de données entier tandis que les poids_échantillon considèrent les poids de toutes les classes pour chaque bloc individuel créé par le générateur. Est-ce exact? Sinon, quelqu'un peut-il développer la question?

class_weight affecte le poids relatif de chaque classe dans le calcul de la fonction objectif. sample_weights, comme son nom l'indique, permet un contrôle supplémentaire du poids relatif des échantillons appartenant à la même classe .

Est-il nécessaire de donner à la fois le class_weight au fit_generator puis le sample_weights en sortie pour chaque bloc? Si oui, alors pourquoi? Sinon, lequel est préférable de donner?

Cela dépend de votre application. Les poids de classe sont utiles lors de la formation sur des ensembles de données très asymétriques; par exemple, un classificateur pour détecter les transactions frauduleuses. Les poids des échantillons sont utiles lorsque vous n'avez pas une confiance égale dans les échantillons de votre lot. Un exemple courant consiste à effectuer une régression sur des mesures avec une incertitude variable.

Si je devais donner les sample_weights pour chaque bloc, comment mapper les poids si certaines classes manquent dans un bloc spécifique? Laissez-moi vous donner un exemple. Dans mon ensemble de données global, j'ai 7 classes (labels) possibles. Étant donné que ces classes sont fortement déséquilibrées, lorsque je crée de plus petits blocs de données en tant que sortie du fit_generator, certaines classes manquent dans le bloc spécifique. Comment dois-je créer les sample_weights pour ces morceaux?

Ce n'est pas un problème. sample_weights est défini sur la base d'un échantillon et est indépendant de la classe. Pour cette raison, la documentation indique que (inputs, targets, sample_weights) doit avoir la même longueur.

La fonction_weighted_masked_objective dans engine/training.py contient un exemple de poids_échantillon appliqué.

15
dhinckley