Qui est le meilleur: LinearSVC ou SVC?
De mes recherches, j'ai trouvé trois des résultats contradictoires:
Quelqu'un peut m'expliquer quand utiliser LinearSVC
vs SVC(kernel="linear")
?
Il semble que LinearSVC est un peu meilleure que SVC et est généralement plus pointilleux. Mais si scikit
a décidé de passer du temps sur la mise en œuvre d'un cas particulier pour la classification linéaire, pourquoi ne pas LinearSVC
surpasser SVC
?
- Ce n'est pas que scikit-learn développé un algorithme dédié pour les SVM linéaire. Ils ont plutôt mis en œuvre des interfaces sur le dessus de deux implémentations existantes. Le C sous-jacente de la mise en œuvre de
LinearSVC
est liblinear, et le solveur pourSVC
est libsvm. Une troisième est la mise en œuvre estSGDClassifier(loss="hinge")
. - Double Possible de en Vertu de quels paramètres sont SVC et LinearSVC dans scikit-learn équivalent?
Vous devez vous connecter pour publier un commentaire.
Mathématiquement, de l'optimisation d'un SVM est un problème d'optimisation convexe, généralement avec un unique minimiseur. Cela signifie qu'il existe une seule solution mathématique du problème d'optimisation.
Les différences dans les résultats issus de plusieurs aspects:
SVC
etLinearSVC
sont censés optimiser le même problème, mais en fait toutes lesliblinear
estimateurs de pénaliser l'ordonnée à l'origine, alors quelibsvm
ce qui n'est pas (IIRC). Cela conduit à une autre mathématique du problème d'optimisation et donc des résultats différents. Il peut aussi y avoir d'autres différences subtiles telles que la mise à l'échelle par défaut et de perte de fonction (edit: assurez-vous de définirloss='hinge'
dansLinearSVC
). Ensuite, dans multiclasse,liblinear
- t-on-vs-reste par défaut alors quelibsvm
ne un-contre-un.SGDClassifier(loss='hinge')
est différent des deux autres en ce sens qu'il utilise la descente de gradient stochastique et non pas exact de descente de gradient et peut ne pas converger vers la même solution. Toutefois, la solution peut généraliser mieux.Entre
SVC
etLinearSVC
, un critère décisif est queLinearSVC
tend à être plus rapide à converger vers le plus grand que le nombre d'échantillons est. Cela est dû au fait que le noyau linéaire est un cas particulier, qui est optimisé pour en Liblinear, mais pas dans Libsvm.Le vrai problème est dans la problème avec scikit approche, où qu'ils appellent SVM quelque chose qui n'est pas SVM. LinearSVC est en fait en minimisant au carré de la charnière de la perte, au lieu de simplement la charnière de la perte, par ailleurs, il pénalise la taille du biais (qui n'est pas SVM), pour plus de détails, reportez-vous à la question:
En vertu de quels paramètres sont SVC et LinearSVC dans scikit-learn équivalent?
Donc à utiliser? C'est purement problème spécifique. En raison de no free lunch theorem il est impossible de dire "cette perte de fonction est le meilleur, période". Parfois, au carré perte fonctionnera mieux, parfois normal de la charnière.
LinearSVC
n'est pas inutile -, il devrait échelle de mieux que le noyau generic méthodes.