Implementación SVM más rápida utilizable en Python


Estoy construyendo algunos modelos predictivos en Python y he estado usando la implementación SVM de scikits learn. Ha sido realmente genial, fácil de usar y relativamente rápido.

Desafortunadamente, estoy empezando a estar limitado por mi tiempo de ejecución. Corro un rbf SVM en un conjunto de datos completo de aproximadamente 4-5000 con 650 características. Cada carrera dura aproximadamente un minuto. Pero con una validación cruzada de 5 veces + búsqueda en cuadrícula (usando una búsqueda de grueso a fino), se está volviendo un poco inviable para mi tarea en cuestión. Por lo general, hacer la gente tiene alguna recomendación en términos de la implementación SVM más rápida que se puede utilizar en Python? ¿Eso, o alguna forma de acelerar mi modelaje?

He oído hablar de la implementación de GPU de LIBSVM, que parece que podría funcionar. No conozco ninguna otra implementación de GPU SVM utilizable en Python, pero definitivamente estaría abierta a otros. Además, ¿el uso de la GPU aumenta significativamente el tiempo de ejecución?

También he oído que hay formas de aproximar el SVM rbf mediante el uso de un SVM lineal + mapa de características en scikits. No estoy seguro de lo que la gente piensa acerca de este enfoque. Una vez más, cualquiera que utilice este enfoque, ¿es un aumento significativo en el tiempo de ejecución?

Todas las ideas para aumentar la velocidad del programa son bienvenidas.

Author: Peter Mortensen, 2012-02-15

9 answers

La implementación SVM del kernel más escalable que conozco es LaSVM. Está escrito en C por lo tanto wrap-able en Python si sabes Cython, ctypes o cffi. Alternativamente, puede usarlo desde la línea de comandos. Puede usar las utilidades en sklearn.datasets para cargar datos de conversión desde un formato NumPy o CSR en archivos con formato svmlight que LaSVM puede usar como conjunto de entrenamiento / prueba.

 27
Author: ogrisel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-19 10:04:59

Alternativamente, puede ejecutar la búsqueda de cuadrícula en 1000 muestras aleatorias en lugar del conjunto de datos completo:

>>> from sklearn.cross_validation import ShuffleSplit
>>> cv = ShuffleSplit(3, test_fraction=0.2, train_fraction=0.2, random_state=0)
>>> gs = GridSeachCV(clf, params_grid, cv=cv, n_jobs=-1, verbose=2)
>>> gs.fit(X, y)

Es muy probable que los parámetros óptimos para 5000 muestras estén muy cerca de los parámetros óptimos para 1000 muestras. Así que esa es una buena manera de comenzar su búsqueda de cuadrícula gruesa.

n_jobs=-1 hace posible utilizar todas sus CPU para ejecutar el CV individual se ajusta en paralelo. Está usando multiprocesamiento para que python GIL no sea un problema.

 22
Author: ogrisel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-15 20:29:17

En primer lugar, de acuerdo con el punto de referencia de scikit-learn ( aquí), scikit-learn ya es uno de los paquetes SVM más rápidos, si no más rápidos. Por lo tanto, es posible que desee considerar otras formas de acelerar la formación.

Como sugiere bavaza, puede intentar multihilo en el proceso de entrenamiento. Si está utilizando la clase GridSearchCV de Scikit-learn, puede establecer fácilmente el argumento n_jobs para que sea mayor que el valor predeterminado de 1 para realizar el entrenamiento en paralelo a expensas de usar más memoria. Puede encontrar su documentación aquí Un ejemplo de cómo usar la clase se puede encontrar aquí

Alternativamente, puede echar un vistazo a la Biblioteca de Aprendizaje Automático Shogun aquí

Shogun está diseñado para el aprendizaje automático a gran escala con envoltorios para muchos paquetes svm comunes y se implementa en C/C++ con enlaces para python. De acuerdo con el punto de referencia de Scikit-learn anterior, su velocidad es comparable a scikit-learn. Sobre otras tareas (distintas de el que demostraron), podría ser más rápido por lo que vale la pena dar una oportunidad.

Por último, puede intentar realizar una reducción de dimensión, por ejemplo, utilizando PCA o PCA aleatorio para reducir la dimensión de sus vectores de entidad. Eso aceleraría el proceso de entrenamiento. La documentación para las clases respectivas se puede encontrar en estos 2 enlaces: PCA, PCA aleatorizado . Puedes encontrar ejemplos de cómo usarlos en la sección de ejemplos de Scikit-learn.

 8
Author: lightalchemist,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-06 15:40:52

Si está interesado en usar solo el núcleo RBF (o cualquier otro núcleo cuadrático para el caso), entonces sugiero usar LIBSVM en MATLAB o Octave. Entreno un modelo de 7000 observaciones y 500 características en unos 6 segundos.

El truco es usar kernels precomputados que LIBSVM proporciona, y usar algebra matricial para calcular el kernel en un paso en lugar de cortar los datos dos veces. El núcleo tarda unos dos segundos en construirse en lugar de mucho más usando el propio núcleo RBF de LIBSVM. Supongo que podrías hacerlo en Python usando NumPy, pero no estoy seguro ya que no lo he probado.

 4
Author: charlieBrown,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-03 07:57:31

Sin ir demasiado lejos en la comparación de bibliotecas SVM, creo que la tarea que está describiendo (validación cruzada) puede beneficiarse de multi-threading real (es decir, ejecutar varias CPU en paralelo). Si está utilizando CPython, no aprovecha su (probablemente) máquina multi-core, debido a GIL.

Puede probar otras implementaciones de Python que no tengan esta limitación. Ver PyPy o IronPython si usted está dispuesto a ir a. NET.

 2
Author: bavaza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-03 07:58:30

Intenta svm_light !

Es una implementación de C increíblemente rápida de los infames Thorsten Joachims en Cornell, con buenos enlaces de Python, y se puede instalar con pip install pysvmlight.

 1
Author: Michael Matthew Toomim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-03 07:59:22

Si su problema está en dos clases, este ajuste de SVM basado en CUDA con scikit-learn es útil:

Https://github.com/niitsuma/gpusvm/tree/master/python

 1
Author: niitsuma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-03 07:59:55

Sugiero mirar la implementación de Scikit-Learn Stochastic Gradient Descent. La pérdida de bisagra por defecto es un SVM lineal. He encontrado que es increíblemente rápido.

 0
Author: szxk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-12 23:32:59

Consideraría usar un bosque aleatorio para reducir el número de entidades que ingrese.

Existe una opción con ExtraTreesRegressor y ExtraTreesClassifier para generar importancias de características. A continuación, puede utilizar esta información para introducir un subconjunto de entidades en su SVM.

 -1
Author: denson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-03 08:01:22