Meilleure façon de gérer un ensemble de données multiclasses non équilibré avec SVM

9

J'essaie de construire un modèle de prédiction avec des SVM sur des données assez déséquilibrées. Mes étiquettes / sorties ont trois classes, positive, neutre et négative. Je dirais que l'exemple positif représente environ 10 à 20% de mes données, neutre environ 50 à 60% et négatif environ 30 à 40%. J'essaie d'équilibrer les classes car le coût associé à des prédictions incorrectes entre les classes n'est pas le même. Une méthode consistait à rééchantillonner les données d'apprentissage et à produire un ensemble de données également équilibré, qui était plus grand que l'original. Fait intéressant, lorsque je fais cela, j'ai tendance à obtenir de meilleures prédictions pour l'autre classe (par exemple, lorsque j'ai équilibré les données, j'ai augmenté le nombre d'exemples pour la classe positive, mais dans les prédictions sur échantillon, la classe négative a fait mieux). N'importe qui peut généralement expliquer pourquoi cela se produit? Si j'augmente le nombre d'exemples pour la classe négative, est-ce que j'obtiendrais quelque chose de similaire pour la classe positive dans les prédictions de l'échantillon (par exemple, de meilleures prédictions)?

Également très ouvert à d'autres réflexions sur la façon dont je peux traiter les données déséquilibrées soit en imposant des coûts différents en cas de mauvaise classification ou en utilisant les pondérations de classe dans LibSVM (je ne sais pas comment les sélectionner / régler correctement cependant).

tomas
la source

Réponses:

6

Avoir des pénalités différentes pour les variables de marge pour les modèles de chaque classe est une meilleure approche que de rééchantillonner les données. Il est asymptotiquement équivalent au rééchantillonnage de toute façon, mais est plus simple à mettre en œuvre et continu, plutôt que discret, vous avez donc plus de contrôle.

Cependant, le choix des poids n'est pas simple. En principe, vous pouvez établir une pondération théorique qui prend en compte les coûts de mauvaise classification et les différences entre la formation et les probabilités opérationnelles de classe antérieure, mais elle ne donnera pas les performances optimales. La meilleure chose à faire est de sélectionner les pénalités / poids pour chaque classe en minimisant la perte (en tenant compte des coûts de mauvaise classification) par validation croisée.

Dikran Marsupial
la source
Existe-t-il un moyen automatisé de procéder ou existe-t-il des apprenants qui intègrent cette fonctionnalité?
Vam
J'écris généralement une fonction matlab pour évaluer la perte pour un ensemble particulier de pénalités, puis je la minimise en utilisant l'algorithme Nelder-Mead simplex. Je ne connais aucune bibliothèque qui a cela intégré.
Dikran Marsupial
@DikranMarsupial Une recherche dans la grille des deux variables de marge marginale dans un problème à deux classes serait-elle équivalente à ce que vous faites avec l'algorithme simplex?
Spacey
@Tarantula oui, la méthode d'optimisation précise est relativement peu importante, le point clé est de s'assurer que vous optimisez la statistique de validation croisée qui vous intéresse vraiment pour les besoins de votre application (c'est-à-dire les mêmes fréquences de classe rencontrées en utilisation opérationnelle) et en tenant compte des coûts de classification erronée s'ils sont connus).
Dikran Marsupial