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?

tomas
fuente
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 !

Zach
fuente
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.

Zach
fuente
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
4

Me doy cuenta de que esta es una pregunta bastante antigua, pero también es posible (dependiendo del tamaño de su conjunto de datos, puede ser más o menos efectivo) usar aproximaciones de baja dimensión del mapa de características del núcleo y luego usarlo en un SVM lineal. Ver http://scikit-learn.org/stable/modules/kernel_approximation.html

Matthew Saltz
fuente
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.

bayerj
fuente
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.

León
fuente
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/

mandar2812
fuente