Données multi-classes asymétriques


10

J'ai un ensemble de données qui contient environ 100 000 échantillons de 50 classes. J'utilise SVM avec un noyau RBF pour former et prédire de nouvelles données. Le problème est que l'ensemble de données est biaisé vers différentes classes.

Par exemple, Classe 1 - 30 (~ 3% chacune), Classe 31 - 45 (~ 0,6% chacune), Classe 46 - 50 (~ 0,2% chacune)

Je vois que le modèle a tendance à prévoir très rarement les classes qui se produisent moins fréquemment dans l'ensemble d'apprentissage, même si l'ensemble d'essai a la même distribution de classe que l'ensemble d'apprentissage.

Je suis conscient qu'il existe des techniques telles que le «sous-échantillonnage» où la classe majoritaire est réduite à la classe mineure. Cependant, est-ce applicable ici où il y a tant de classes différentes? Existe-t-il d'autres méthodes pour gérer ce cas?

Réponses:


5

Je vous suggère d'utiliser libsvm, qui contient déjà des poids de classe ajustables. Plutôt que de répliquer les échantillons d'apprentissage, on modifie le paramètre C pour différentes classes dans l'optimisation SVM. Par exemple, si vos données ont 2 classes et que la première classe ne représente que 10% des données, vous choisirez les pondérations de classe à 10 et 1 pour la classe 1 et 2 respectivement. Par conséquent, les violations de marge de la première classe coûteraient 10 fois plus que les violations de marge de la deuxième classe, et les précisions par classe seraient plus équilibrées.


merci pour les conseils, savez-vous si libsvm le fait automatiquement ou dois-je passer manuellement les poids de classe?
mike1886

Vous devez passer manuellement les poids de classe. La façon de le faire est différente en fonction de l'interface que vous utilisez (python, java, matlab, c). Il est bien documenté dans les fichiers Lisez-moi si vous téléchargez l'outil à partir de csie.ntu.edu.tw/~cjlin/libsvm . De plus, la taille de vos données semble être grande et l'implémentation multi-classe par défaut de libsvm utilisera une classification un contre un qui peut prendre trop de temps à s'exécuter. Vous pouvez essayer de former 50 classificateurs binaires un contre tous en spécifiant les poids de manière appropriée.
magicharp

2

Je ne suis pas une exportation en utilisant des SVM, mais généralement (si vous utilisez une bibliothèque d'apprentissage automatique comme Python scikit-learnou R libsvm, il y a le class_weightparamètre, ou class.weights, respectivement.

Ou si vous utilisiez un classifieur Bayes, vous tiendriez compte de ce "biais" via les "probabilités antérieures (classe)" P (ω j )


1

En ce qui concerne l'approche, SVM avec un noyau RBF fait un bon travail, mais les SVM peuvent être ralentis par de grandes tailles d'objets, sauf si vous utilisez CV avec par exemple un dixième des données assignées au hasard à chaque pli. Cependant, vous êtes-vous demandé pourquoi vous employez des SVM en premier lieu?

Avez-vous essayé la régression linéaire multivariée, , où chaque enregistrement de est codé si le ème objet est dans classe , et sinon? Si la précision de la classification est sensiblement élevée à l'aide de la régression linéaire, alors vos données sont linéairement séparables et des méthodes plus complexes telles que les SVM et les ANN ne sont pas nécessaires. L'étape 2 consisterait à montrer que le plus proche voisin k, les Bayes naïfs, l'analyse discriminante linéaire (Fisher), la régression logistique polytomique, etc., se décomposent et échouent.Oui=XβOuiyjej=+1jejyjej=-1

Pour la terminologie, vous pourriez aborder la question d'avoir plus de poids de classe dans le contexte de «proportions plus faibles d'objets dans certaines classes» ou de «taille de classe proche de zéro». L'asymétrie a tendance à être utilisée pour décrire la distribution des valeurs d'une entité, comme dans l'asymétrie, la queue grasse, etc.

De combien de fonctionnalités disposez-vous? Avez-vous essayé le clustering non supervisé (découverte de classe) sur les 100 000 objets avant d'essayer la classification supervisée (prédiction de classe) avec SVM? Peut-être que les 100 000 objets peuvent être regroupés en moins de 50 classes, pour lesquelles la nouvelle appartenance à une classe pourrait être utilisée comme classe cible lors de l'analyse de classification. Cela peut atténuer le problème d'avoir une taille de classe proche de zéro.


1

J'ai rencontré ce problème plusieurs fois lors de l'utilisation de SVM avec le noyau Rbf. L'utilisation du noyau linéaire au lieu du noyau Rbf a résolu mon problème, mais j'ai traité avec moins de classes. Les résultats étaient moins biaisés et plus précis avec le noyau linéaire. J'espère que ceci résoudra votre problème.

Edit: Bien que j'aie écrit la réponse originale, j'étais assez naïf pour ne pas envisager de pondérer les classes car l'une d'entre elles a répondu correctement. De plus, lors de l'utilisation du noyau rbf, il est important de s'assurer que le paramètre de pénalité ou la valeur «C» selon le module svm de sklearn est trop générique. Je trouve que la valeur par défaut de C = 1 est trop générique la plupart du temps et je me retrouve généralement avec une valeur de C = 10000. J'espère que cela aide ceux qui obtiennent des résultats biaisés avec svm (rbf) malgré une bonne distribution des classes dans les données.


Merci pour la réponse! J'ai en fait essayé de nombreux autres algorithmes / noyaux et j'ai toujours le même type de problème. Je recherche donc davantage une approche comme le sous-échantillonnage ou un moyen d'équilibrer les classes.
mike1886

Ok, vous pouvez également essayer de répliquer des lignes pour les classes contenant des données éparses, bien que ce ne soit utile que si les fonctionnalités des données éparses sont vraiment bonnes.
user776193
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.