J'ai récemment commencé à apprendre à travailler avec sklearn
et je viens de découvrir ce résultat particulier.
J'ai utilisé l' digits
ensemble de données disponible dans sklearn
pour 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 sklearn
pour la classification SVM: SVC
et 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: Alors que l'estimateur SVC linéaire a produit l'histogramme suivant:
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.
la source
Similar 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).
Réponses:
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.
Permet d'abord d'évaluer la variance -
Jetez maintenant un œil à vos parcelles:
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!
la source
Si vous avez utilisé le noyau par défaut dans SVC (), le noyau Radial Basis Function (rbf), vous avez probablement appris une frontière de décision plus non linéaire. Dans le cas de l' ensemble de données de chiffres , cela surpassera largement une limite de décision linéaire sur cette tâche (voir 3.1 «Classificateur linéaire de base»)
la source