web-dev-qa-db-fra.com

Lequel est le meilleur: LinearSVC ou SVC?

De mes recherches, j'ai trouvé trois résultats contradictoires:

  1. SVC(kernel="linear") est mieux
  2. LinearSVC est mieux
  3. Peu importe

Quelqu'un peut-il expliquer quand utiliser LinearSVC vs SVC(kernel="linear")?

Il semble que LinearSVC soit légèrement meilleur que SVC et soit généralement plus capricieux. Mais si scikit décidait de consacrer du temps à l'implémentation d'un cas spécifique de classification linéaire, pourquoi LinearSVC ne surclasserait-il pas SVC?

20

Mathématiquement, l'optimisation d'un SVM est un problème d'optimisation convexe, généralement avec un minimiseur unique. Cela signifie qu'il n'y a qu'une seule solution à ce problème d'optimisation mathématique.

Les différences de résultats proviennent de plusieurs aspects: SVC et LinearSVC sont censés optimiser le même problème, mais en fait tous les estimateurs liblinear pénalisent l'interception, tandis que libsvm ceux non (IIRC). Cela conduit à un problème d'optimisation mathématique différent et donc à des résultats différents. Il peut également y avoir d'autres différences subtiles telles que la mise à l'échelle et la fonction de perte par défaut (modifier: assurez-vous de définir loss='hinge' Dans LinearSVC). Ensuite, dans la classification multiclasse, liblinear fait un contre un par défaut tandis que libsvm fait un contre un.

SGDClassifier(loss='hinge') est différent des deux autres dans le sens où il utilise une descente de gradient stochastique et non une descente de gradient exacte et peut ne pas converger vers la même solution. Cependant la solution obtenue peut mieux se généraliser.

Entre SVC et LinearSVC, un critère de décision important est que LinearSVC a tendance à être plus rapide pour converger plus le nombre d'échantillons est élevé. Cela est dû au fait que le noyau linéaire est un cas spécial, qui est optimisé pour dans Liblinear, mais pas dans Libsvm.

25
eickenberg

Le problème réel est dans le problème avec l'approche scikit , où ils appellent quelque chose SVM qui n'est pas SVM . LinearSVC minimise en fait la perte de charnière au carré, au lieu de la perte de charnière, en outre, il pénalise la taille du biais (qui n'est pas SVM ), pour plus de détails se référer à une autre question: Sous quels paramètres SVC et LinearSVC sont-ils en équivalent scikit-learn?

Alors lequel utiliser? Il est purement spécifique au problème . Comme en raison de l'absence de théorème du déjeuner gratuit, il est impossible de dire "cette fonction de perte est la meilleure, point final". Parfois, la perte au carré fonctionnera mieux, parfois la charnière normale.

7
lejlot