Pouvez-vous expliquer la différence entre SVC et LinearSVC dans scikit-learn?


19

J'ai récemment commencé à apprendre à travailler avec sklearnet je viens de découvrir ce résultat particulier.

J'ai utilisé l' digitsensemble de données disponible dans sklearnpour essayer différents modèles et méthodes d'estimation.

Lorsque j'ai testé un modèle de machine à vecteurs de support sur les données, j'ai découvert qu'il existe deux classes différentes sklearnpour la classification SVM: SVCet LinearSVC, où la première utilise une approche un contre un et l'autre une approche un contre un repos .

Je ne savais pas quel effet cela pouvait avoir sur les résultats, j'ai donc essayé les deux. J'ai fait une estimation de style Monte Carlo où j'ai exécuté les deux modèles 500 fois, chaque fois en divisant l'échantillon de manière aléatoire en un entraînement de 60% et un test de 40% et en calculant l'erreur de la prédiction sur l'ensemble de test.

L'estimateur SVC régulier a produit l'histogramme d'erreurs suivant: Taux d'erreur SVC Alors que l'estimateur SVC linéaire a produit l'histogramme suivant: Taux d'erreur SVC linéaire

Qu'est-ce qui pourrait expliquer une telle différence? Pourquoi le modèle linéaire a-t-il la plus grande précision la plupart du temps?

Et, corrélativement, qu'est-ce qui pourrait être à l'origine de la forte polarisation des résultats? Soit une précision proche de 1, soit une précision proche de 0, rien entre les deux.

À titre de comparaison, une classification par arbre de décision a produit un taux d'erreur beaucoup plus normalement distribué avec une précision d'environ 0,85.


Je suppose que la documentation scikit-learn ne met pas en évidence la différence? Avez-vous vérifié?
Rohit

1. Quel noyau avez-vous utilisé dans SVC? paramètres par défaut = "rbf"? 2. Les approches un contre un et un contre tous sont différentes
kpb

la documentation est un peu clairsemée / vague sur le sujet. Il mentionne la différence entre un contre un et un contre-repos, et que le SVS linéaire estSimilar to SVC with parameter kernel=’linear’, but implemented in terms of liblinear rather than libsvm, so it has more flexibility in the choice of penalties and loss functions and should scale better (to large numbers of samples).
metjush

pour SVC normal, j'ai utilisé le noyau par défaut. Je sais que 1v1 et 1vR sont des approches différentes, mais je suppose que c'est ce que je veux savoir - pourquoi produisent-ils des résultats si différents? Est-ce le choix du noyau ou l'approche différente de la classification à catégories multiples?
metjush

Réponses:


23

Un SVM standard avec des valeurs par défaut utilise une fonction de base radiale comme noyau SVM. Il s'agit essentiellement d'un noyau gaussien alias courbe en cloche. Cela signifie que le no man's land entre les différentes classes est créé avec une fonction gaussienne. Le linéaire-SVM utilise un noyau linéaire pour la fonction de base, vous pouvez donc penser à cela comme une fonction en forme de ^. Il est beaucoup moins accordable et n'est fondamentalement qu'une interpolation linéaire.

Les gens sont en train de marteler cette question parce que vous n'avez pas fourni beaucoup d'informations, mais en approfondissant ce que vous avez publié ... cela touche certains aspects fondamentaux de la compréhension réelle des détails du biais et de la variance et de la différence entre linéaire et non linéaire fonctions de base dans SVM.

Découvrez cette image décrivant les quatre régions de biais élevé et faible et de variance élevée et faible. De toute évidence, le meilleur endroit où être est une faible variance et un faible biais.

image de variation de biais de fléchettes

Permet d'abord d'évaluer la variance -

Jetez maintenant un œil à vos parcelles: entrez la description de l'image ici

La fonction de base non linéaire présente une variance plus élevée. Voyez comment il est plus bruyant que le noyau linéaire! Le noyau linéaire a une variance plus faible. Voyez comme c'est moins bruyant!

Permet maintenant d'évaluer le biais -

Quel noyau est plus précis? Nous pouvons ajouter les erreurs que vous avez fournies. Le noyau non linéaire a une erreur totale de ~ 550 + 325 = ~ 875. Le noyau linéaire a une erreur de ~ 690 + ~ 50 = ~ 740. Donc, le noyau linéaire semble faire mieux dans l'ensemble, mais ils sont globalement assez proches. C'est là que les choses se sont compliquées!

Mettre tous ensemble

Voyez comment le noyau linéaire a fait un mauvais travail sur les 1 et un très bon travail sur les 0. C'est assez déséquilibré. Alors que le noyau non linéaire est plus équilibré. Il semble que le point idéal pourrait être de créer un modèle équilibré qui ne présente pas une variance aussi élevée. Comment contrôlons-nous la variance élevée? Bingo - régularisation. Nous pouvons ajouter une régularisation au modèle non linéaire et nous verrons probablement de bien meilleurs résultats. Il s'agit du paramètre C dans scikit learn SVMs, que vous voudrez augmenter par défaut. Nous pourrions également jouer avec le paramètre gamma. Gamma contrôle la largeur de la gaussienne. Essayez peut-être d'augmenter légèrement celui-ci pour obtenir des résultats moins bruyants, par exemple un no-man's land plus grand entre les classes.

J'espère que cela t'aides!


Le paramètre C doit être diminué de la valeur par défaut et non augmenté.
Hamdi

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.