La sortie de Scikit SVM dans la classification multiclasse donne toujours la même étiquette

10

J'utilise actuellement Scikit learn avec le code suivant:

clf = svm.SVC(C=1.0, tol=1e-10, cache_size=600, kernel='rbf', gamma=0.0, 
              class_weight='auto')

puis ajuster et prévoir pour un ensemble de données avec 7 étiquettes différentes. J'ai une sortie bizarre. Quelle que soit la technique de validation croisée que j'utilise, l'étiquette prédite sur l'ensemble de validation sera toujours l'étiquette 7.

J'essaie d'autres paramètres, y compris celui par défaut complet ( svm.SVC()) mais tant que la méthode du noyau que j'utilise est à la rbfplace de polyou linearcela ne fonctionnerait tout simplement pas, alors que cela fonctionne très bien pour polyet linear.

D'ailleurs, j'ai déjà essayé la prédiction sur les données des trains au lieu des données de validation et cela correspond parfaitement.

Est-ce que quelqu'un voit ce genre de problème avant et sait ce qui se passe ici?

Je ne regarde jamais ma distribution de classe en détail mais je sais qu'elle devrait être d'environ 30% d'entre eux sont 7, 14% sont 4.

J'essaie même une implémentation manuelle 1-vs-rest et ce n'est toujours pas utile.

Tamaki Sakura
la source
Quelles sont les proportions de vos données qui tombent dans chacune des classes?
gung - Réintégrer Monica
Il y a en effet plus de "7" dans mes données mais pas tant que ça. Environ 30% d'entre eux ont 7 ans. @Gung
Tamaki Sakura

Réponses:

10

Une cause probable est le fait que vous n'accordez pas votre modèle. Vous devez trouver de bonnes valeurs pour et . Dans votre cas, les valeurs par défaut s'avèrent mauvaises, ce qui conduit à des modèles triviaux qui donnent toujours une certaine classe. Ceci est particulièrement courant si une classe a beaucoup plus d'instances que les autres. Quelle est votre distribution de classe?Cγ

scikit-learn dispose de fonctionnalités de recherche hyperparamétriques limitées, mais vous pouvez l'utiliser avec une bibliothèque de réglages comme Optunity . Un exemple sur le réglage de SVC Scikit-Learn avec Optunity est disponible ici .

Avertissement: je suis le développeur principal d'Optunity.

Marc Claesen
la source
J'ai effectivement essayé toutes les combinaisons de C et de gamma d'une puissance de 10 de 0 à 4, mais toutes me donnent plein 7. J'ai même commencé à douter que je compile le scikit learn de la bonne manière.
Tamaki Sakura
8

Le problème se révèle être un test de paramètres. Je n'ai pas essayé quand gammaest entre 0.0 (qui est 1 / n_feature) et 1. Sur mes données gammadevraient être tournées vers quelque chose autour1e-8

Tamaki Sakura
la source
4
Cela est parfaitement logique. Des valeurs trop grandes de conduisent à une matrice de noyau proche de la matrice unitaire. Chaque prédiction finira par être le terme de biais (car toutes les évaluations du noyau sont très proches de zéro), ce qui conduit à la classe 7 dans votre cas. γ
Marc Claesen