Implementación SVM más rápida


16

Más de una pregunta general. Estoy ejecutando un SVM rbf para el modelado predictivo. Creo que mi programa actual definitivamente necesita un poco más de velocidad. Yo uso scikit learn con una búsqueda de grilla gruesa a fina + validación cruzada.

Cada ejecución de SVM toma alrededor de un minuto, pero con todas las iteraciones, todavía lo encuentro demasiado lento. Suponiendo que eventualmente realice múltiples subprocesos de la parte de validación cruzada en múltiples núcleos, ¿alguna recomendación para acelerar mi programa? ¿Alguna implementación más rápida de SVM? He oído hablar de algunos SVM de GPU, pero no he investigado mucho. ¿Algún usuario y es más rápido?


1
SGDClassifier en scikit-learn es muy rápido, pero para SVM lineales. Puede preguntarle a los chicos de scikit-learn, también agregue la etiqueta scikit-learn.
denis

Los kernels no lineales SVM están condenados a ser lentos. Quizás deberías comenzar a jugar con modelos lineales (mira Vowpal Wabbit) y luego ir a no lineal. Incluso puede obtener algo de no linealidad creando características más complicadas con modelos lineales. Muy a menudo, los modelos no lineales dan como resultado un aumento de rendimiento incremental con un gran gasto computacional. Nada contra SVM de kernel no lineal, sino solo tener en cuenta, desde el punto de vista práctico.
Vladislavs Dovgalecs

1
Puede acelerar utilizando bibliotecas de ajuste especializadas para la búsqueda de hiperparámetros, que son mucho más eficientes que la búsqueda de cuadrícula (es decir, requieren probar muchos menos conjuntos de hiperparámetros). Los ejemplos de bibliotecas de ajuste incluyen Optunity e Hyperopt.
Marc Claesen

Respuestas:


16

El algoritmo Sofía de Google contiene una implementación extremadamente rápida de un SVM lineal. Es uno de los SVM más rápidos que existen, pero creo que solo admite la clasificación y solo admite SVM lineales.

¡Incluso hay un paquete R !


Su enlace ahora dice "el paquete 'RSofia' fue eliminado del repositorio de CRAN". ¿Alguna idea de por qué?
James Hirschorn el

@JamesHirschorn El desarrollador probablemente dejó de mantenerlo. Puede instalarlo desde el archivo CRAN.
Zach

10

La aceleración más fácil que obtendrá es ejecutar la validación cruzada en paralelo. Personalmente, me gusta el paquete caret en R , que usa foreach como backend. Hace que sea muy fácil cultivar la validación cruzada y la búsqueda de cuadrícula en múltiples núcleos o múltiples máquinas.

Caret puede manejar muchos modelos diferentes, incluidos los SVM de rbf:

library(caret)
library(doMC)
registerDoMC()
model <-  train(Species ~ ., data = iris, method="svmRadial", 
    trControl=trainControl(method='cv', number=10))
> confusionMatrix(model)
Cross-Validated (10 fold) Confusion Matrix 

(entries are percentages of table totals)

            Reference
Prediction   setosa versicolor virginica
  setosa       32.4        0.0       0.0
  versicolor    0.0       30.9       2.0
  virginica     0.9        2.4      31.3

Tenga en cuenta que la biblioteca doMC () solo está disponible en mac y linux, debe ejecutarse desde la línea de comandos, no desde una GUI, y rompe cualquier modelo de RWeka. También es fácil usar clústeres MPI o SNOW como backend paralelo, que no tienen estos problemas.


Gracias Zach Creo que los scikits también tienen una forma de ejecutar la validación cruzada en paralelo, que es lo que planeo hacer. Excluyendo eso, ¿alguna otra sugerencia sobre la aceleración? Gracias.
tomas

@danjeharry: la validación cruzada paralela es realmente la fruta de bajo perfil aquí, y le sugiero encarecidamente que explore eso primero. Más allá de eso, no sé mucho sobre cómo acelerar las SVM específicamente. Si puede encontrar un algoritmo SVM paralelo, también podría ser una buena idea. ¿Cuántas filas / columnas tiene el conjunto de datos que estás usando para entrenar?
Zach

Gracias Zach voy a mirar en paralelo cv. Estoy haciendo unos 650 atributos y 5000 ejemplos.
tomas


2

Echa un vistazo al módulo de multiprocesamiento de Python . Hace que la paralelización de las cosas sea realmente fácil y es perfecta para la validación cruzada.


2

R tiene un excelente paquete de svm acelerado por GPU rpusvm , toma ~ 20 segundos entrenar en muestras de 20K * 100 dimensiones, y descubrí que la CPU nunca está sobrecargada, por lo que usa la GPU de manera eficiente. Sin embargo, requiere una GPU NVIDIA.


1

Alerta: este es un enchufe descarado.

Considere DynaML, una biblioteca de ML basada en Scala en la que estoy trabajando. He implementado LS-SVM basado en kernel (Máquinas de vectores de soporte de mínimos cuadrados) junto con la optimización automática del kernel, utilizando la búsqueda de cuadrícula o el recocido simulado acoplado.

http://mandar2812.github.io/DynaML/

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.