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?
la source
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-learn
ou Rlibsvm
, il y a leclass_weight
paramètre, ouclass.weights
, respectivement.Ou si vous utilisiez un classifieur Bayes, vous tiendriez compte de ce "biais" via les "probabilités antérieures (classe)" P (ω j )
la source
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.Y = X β Oui yje j= + 1 je j yje j= - 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.
la source
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.
la source