De mes recherches, j'ai trouvé trois résultats contradictoires:
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
?
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.
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.