¿Puedes explicar la diferencia entre SVC y LinearSVC en scikit-learn?


19

Recientemente comencé a aprender a trabajar sklearny acabo de encontrar este resultado peculiar.

Utilicé el digitsconjunto de datos disponible sklearnpara probar diferentes modelos y métodos de estimación.

Cuando probé un modelo de máquina de vectores de soporte en los datos, descubrí que hay dos clases diferentes sklearnpara la clasificación SVM: SVCy LinearSVC, donde el primero usa el enfoque uno contra uno y el otro usa el enfoque uno contra el resto .

No sabía qué efecto podría tener en los resultados, así que probé ambos. Hice una estimación al estilo de Monte Carlo donde ejecuté ambos modelos 500 veces, cada vez dividiendo la muestra aleatoriamente en 60% de entrenamiento y 40% de prueba y calculando el error de la predicción en el conjunto de prueba.

El estimador SVC regular produjo el siguiente histograma de errores: Tasa de error de SVC mientras que el estimador SVC lineal produjo el siguiente histograma: Tasa de error de SVC lineal

¿Qué podría explicar una diferencia tan marcada? ¿Por qué el modelo lineal tiene una precisión tan alta la mayor parte del tiempo?

Y, en relación, ¿qué podría estar causando la fuerte polarización en los resultados? O una precisión cercana a 1 o una precisión cercana a 0, nada intermedio.

A modo de comparación, una clasificación de árbol de decisión produjo una tasa de error mucho más distribuida normalmente con una precisión de alrededor de .85.


¿Asumo que la documentación de scikit-learn no resalta la diferencia? ¿Has comprobado?
Rohit

1. ¿Qué núcleo usaste en SVC? configuración predeterminada = "rbf"? 2. Uno contra uno y uno contra todos son enfoques diferentes
kpb

la documentación es un poco escasa / vaga sobre el tema. Menciona la diferencia entre uno contra uno y uno contra descanso, y que el SVS lineal esSimilar 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).
metjush

para SVC normal, utilicé el kernel predeterminado. Sé que 1v1 y 1vR son enfoques diferentes, pero supongo que eso es lo que quiero saber: ¿por qué producen resultados tan diferentes? ¿Es la elección del núcleo o el enfoque diferente para la clasificación de categorías múltiples?
metjush

Respuestas:


23

Un SVM normal con valores predeterminados utiliza una función de base radial como el núcleo SVM. Esto es básicamente un núcleo gaussiano, también conocido como curva de campana. Lo que significa que la tierra de nadie entre diferentes clases se crea con una función gaussiana. El SVM lineal utiliza un núcleo lineal para la función base, por lo que puede pensar en esto como una función en forma de ^. Es mucho menos sintonizable y es básicamente una interpolación lineal.

La gente está respondiendo esta pregunta porque no proporcionó mucha información, pero analizando profundamente lo que publicó ... esto golpea algunos aspectos fundamentales para comprender realmente los detalles del sesgo y la varianza y la diferencia entre lineal y no lineal funciones básicas en SVM.

Echa un vistazo a esta imagen que describe las cuatro regiones de sesgo alto y bajo y varianza alta y baja. Obviamente, el mejor lugar para estar es baja varianza y bajo sesgo.

imagen de variación de sesgo de dardos

Primero vamos a evaluar la varianza:

Ahora eche un vistazo a sus parcelas: ingrese la descripción de la imagen aquí

La función de base no lineal tiene mayor varianza. ¡Vea cómo es más ruidoso que el núcleo lineal! El núcleo lineal tiene menor varianza. ¡Mira cómo es menos ruidoso!

Ahora vamos a evaluar el sesgo:

¿Qué núcleo es más preciso? Podemos agregar los errores que nos proporcionó. El núcleo no lineal tiene un error total de ~ 550 + 325 = ~ 875. El núcleo lineal tiene un error de ~ 690 + ~ 50 = ~ 740. Entonces, el núcleo lineal parece tener un mejor desempeño general, pero en general están bastante cerca. ¡Esto es donde las cosas se ponen difíciles!

Poniendolo todo junto

Vea cómo el núcleo lineal hizo un mal trabajo en 1 y un gran trabajo en 0. Esto está bastante desequilibrado. Donde como el núcleo no lineal está más equilibrado. Parece que el punto óptimo podría ser crear un modelo equilibrado que no tenga una variación tan alta. ¿Cómo controlamos la alta varianza? Bingo - regularización. Podemos agregar regularización al modelo no lineal y probablemente veremos resultados mucho mejores. Este es el parámetro C en scikit learn SVM, que querrá aumentar desde el valor predeterminado. También podríamos jugar con el parámetro gamma. Gamma controla el ancho del gaussiano. Tal vez intente aumentarlo ligeramente para obtener resultados menos ruidosos, por ejemplo, una tierra de nadie más grande entre clases.

¡Espero que esto ayude!


El parámetro C debe reducirse del valor predeterminado, no aumentarse.
Hamdi

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.