De mi investigación, encontré tres resultados contradictorios:

  1. SVC(kernel="linear") es mejor
  2. LinearSVC es mejor
  3. No importa

¿Alguien puede explicar cuándo usar LinearSVC frente a SVC(kernel="linear")?

Parece que LinearSVC es ligeramente mejor que SVC y suele ser más delicado. Pero si scikit decidió dedicar tiempo a implementar un caso específico para la clasificación lineal, ¿por qué LinearSVC no superaría a SVC?

33
THIS USER NEEDS HELP 29 ene. 2016 a las 06:55

2 respuestas

La mejor respuesta

Matemáticamente, optimizar una SVM es un problema de optimización convexa, generalmente con un minimizador único. Esto significa que solo hay una solución para este problema de optimización matemática.

Las diferencias en los resultados provienen de varios aspectos: se supone que SVC y LinearSVC optimizan el mismo problema, pero de hecho todos los estimadores liblinear penalizan la intersección, mientras que los libsvm no 't (IIRC). Esto conduce a un problema de optimización matemática diferente y, por lo tanto, a resultados diferentes. También puede haber otras diferencias sutiles como la escala y la función de pérdida predeterminada (editar: asegúrese de configurar loss='hinge' en LinearSVC). A continuación, en la clasificación multiclase, liblinear hace uno contra el resto de forma predeterminada, mientras que libsvm hace uno contra uno.

SGDClassifier(loss='hinge') es diferente de los otros dos en el sentido de que utiliza un descenso de gradiente estocástico y no un descenso de gradiente exacto y puede que no converja en la misma solución. Sin embargo, la solución obtenida puede generalizarse mejor.

Entre SVC y LinearSVC, un criterio de decisión importante es que LinearSVC tiende a converger más rápido cuanto mayor es el número de muestras. Esto se debe al hecho de que el kernel lineal es un caso especial, que está optimizado en Liblinear, pero no en Libsvm.

32
eickenberg 1 feb. 2016 a las 10:32

El problema real está en el problema con el enfoque scikit , donde llaman a SVM algo que no es SVM . LinearSVC en realidad minimiza la pérdida de bisagra cuadrada, en lugar de solo la pérdida de bisagra; además, penaliza el tamaño del sesgo (que no es SVM ); para obtener más detalles, consulte otra pregunta: ¿Bajo qué parámetros son SVC y ¿LinearSVC en equivalente de scikit-learn?

Entonces, ¿cuál usar? Es puramente específico del problema . Como no existe el teorema del almuerzo gratis, es imposible decir "esta función de pérdida es la mejor, punto". A veces, la pérdida al cuadrado funcionará mejor, a veces la bisagra normal.

12
Community 23 may. 2017 a las 12:24