Résolvez facilement le déséquilibre des classes avec Pytorch Partie 2
Compréhension WeightedRandomSampler de Pytorch
Dans l’article précédent, nous avons vu comment résoudre le déséquilibre de classe en suréchantillonnant avec WeightedRandomSampler. En pratique, cela réduit les risques de sur-ajustement. Dans cet article, nous montrerons comment WeightedRandomSampler est implémenté et donne une certaine intuition à l’utilisateur. Nous donnons d’abord un exemple où nous appliquons des statistiques simples, puis nous abordons mathématiquement un scénario plus général. Le but est de comprendre comment on finit par avoir le même nombre d’observations de chaque classe même si elles sont déséquilibrées.
Rien de pire que de ne pas comprendre ce que nous utilisons, non? 🤗
Voyons maintenant le code source de WeightedRandomSampler implémenté dans Pytorch. Nous allons faire un peu de théorie pour comprendre le code et ensuite regarder un exemple simple pour avoir une bonne compréhension de l’implémentation.
dans le code source de Pytorch, la fonction clé est la suivante:
Une idée clé: puisant dans une distribution multinomiale à paramètres contrôlés.
Pytorch utilise une distribution multinomiale avec les paramètres donnés, à savoir le poids, le nombre d’échantillons et si nous échantillonnons avec remplacement ou pas.
L’idée clé introduite par Pytorch est de puiser dans une distribution multinomiale sur l’ensemble des points. Chaque point se voit attribuer une probabilité donnée d’être échantillonné. Cette probabilité est définie par sa classe avec le paramètre de poids donné.
Un exemple simple:
Supposons que nos points de données soient ordonnés comme suit:
Nous pouvons contrôler les poids pour donner plus de poids pour la classe mineure:
Nous dessinons ensuite une distribution multinomiale avec des paramètres contrôlés. Chaque paramètre définit la probabilité d’un dessin d’une observation donnée. En effet, nous nous appuyons sur une distribution multinomiale sur l’ensemble des observations.
Ici, nous définissons les paramètres de poids comme suit:
Les probabilités peuvent être trouvées en normalisant simplement le vecteur de poids en utilisant quelque chose de similaire à un softmax une fonction. Par exemple, on peut faire ce qui suit:
Note importante: Il faut faire la normalisation sur l’ensemble des N observations. Le but est d’avoir un vecteur où la somme des éléments est égale à un. Ceci n’est pas réalisé par le vecteur de poids, donc une normalisation est nécessaire.
Maintenant, pouvons-nous montrer mathématiquement comment nous finissons par échantillonner 50 observations de c0 et 50 observations de c1 après avoir tiré 100 échantillons aléatoires?
Soit une variable aléatoire décrivant le nombre d’observations en c1 après échantillonnage de m points, fixé à 100 ici.
Par conséquent,
Maintenant, nous savons qu’à partir d’une distribution multinomiale, après avoir échantillonné m fois, nous pouvons exprimer la valeur attendue comme suit:
Pour toutes les observations dans les positions [91, 100], nous avons dit qu’ils sont en classe c1:
En conséquence, le le nombre attendu de points tirés de la classe mineure c1, qui contient à l’origine 10 points, est maintenant de 50. De même, le nombre attendu d’observations de la classe principale c0 est le suivant:
le le nombre attendu d’observations tirées de la classe c1 est également d’environ 50.
Plus de rigueur, plus générale:
Dans cette section, nous essayons d’être plus généraux. Pour simplifier, cependant, nous supposons que nous traitons un problème binaire avec seulement deux classes c0 et c1.
Nous avons maintenant N observations telles que:
Nous devons construire des probabilités comme dans l’exemple vu précédemment. Cette fois, nous avons:
Maintenant, nous voulons générer m points échantillonnés à partir d’une distribution multinomiale sur l’ensemble des points X: Multinomial(X, [p0, …, p0, p1, .., p1]).
Nous définissons une variable aléatoire décrivant si un point appartient à la classe c0:
En conséquence, nous pouvons facilement exprimer la valeur attendue d’une telle variable aléatoire:
Décrivons maintenant la variable aléatoire qui donne le nombre total de points échantillonnés de la classe c0:
Par conséquent, nous pouvons calculer le nombre attendu d’éléments échantillonnés de la classe c0 après m fois:
Nous avons vu précédemment comment définir les poids WeightedRandomSampler:
Maintenant, nous pouvons avoir une expression plus simple du nombre attendu d’éléments échantillonnés à partir de la classe c0 après m fois:
Cela signifie que nous nous attendons à ce que exactement la moitié des observations échantillonnées proviennent de la classe mineure. Nous avons mathématiquement corrigé le déséquilibre de classe en montrant que nous pouvons échantillonner exactement le même nombre d’observations de la classe mineure que de la classe principale.
Pour aller plus loin avec Bayes:
Ajouter du poids à chaque classe équivaut à Bayésien approche. Nous peaufinons les prieurs en donnant plus de poids à la classe mineure. L’équivalence est mise en évidence par la relation suivante:
En effet, nous pouvons baser notre méthode d’échantillonnage sur la théorie bayésienne où nous introduisons un nouvel élément appelé a priori. Le processus est un échantillonnage séquentiel:
- Étape 1: Lancez une pièce non équitable avec une probabilité p (c0) pour obtenir une classe mineure c0 et une probabilité p (c1) pour obtenir une classe majeure c1.
- Étape 2: À partir de la classe, dessinée à l’étape précédente, échantillonnez une observation uniformément:
Conclusion
En conclusion, en utilisant WeightedRandomSampler avec une distribution multinomiale, nous nous attendons à avoir un nombre égal d’observations tirées de chaque classe.
L’idée clé réside dans la construction d’une distribution multinomiale sur l’ensemble des observations où chaque observation se comporte comme sa propre classe avec une probabilité contrôlée d’être dessinée.
Contributeurs:
Souhail. Etudiante en Master de Mathématiques Appliquées à l’Ecole polytechnique fédérale de Lausanne.
Mastafa. Auparavant stagiaire Data Scientist chez Microsoft et étudiant en apprentissage automatique au KTH Royal Institute of Technology à Stockholm.