python - poly - scikit learn mlp example
La implementación más rápida de SVM utilizable en Python (9)
¡Prueba svm_light !
Es una implementación de C malísima de la infame Thorsten Joachims en Cornell , con buenas fijaciones de Python, y puedes instalarla con pip install pysvmlight
.
Estoy construyendo algunos modelos predictivos en Python y he estado utilizando 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. Ejecuto un rbf SVM en un conjunto de datos completo de aproximadamente 4 - 5000 con 650 funciones. Cada carrera dura aproximadamente un minuto. Pero con una validación cruzada de 5 veces + búsqueda en cuadrícula (usando una búsqueda gruesa a fina), se está volviendo un poco inviable para mi tarea. Entonces, en general, ¿las personas tienen alguna recomendación en cuanto a la implementación más rápida de SVM que se puede usar en Python? ¿Eso o alguna forma de acelerar mi modelado?
He oído hablar de la implementación de la GPU de LIBSVM, que parece que podría funcionar. No conozco ninguna otra implementación GPU SVM utilizable en Python, pero definitivamente estaría abierta para otros. Además, ¿el uso de la GPU aumenta significativamente el tiempo de ejecución?
También he escuchado que hay formas de aproximar el rbf SVM utilizando un mapa de características SVM + lineal en scikits. No estoy seguro de lo que las personas piensan sobre este enfoque. Nuevamente, cualquiera que use este enfoque, ¿es un aumento significativo en el tiempo de ejecución?
Todas las ideas para aumentar la velocidad del programa son bienvenidas.
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 forma de comenzar la búsqueda de grillas gruesas.
n_jobs=-1
hace posible usar todas sus CPU para ejecutar los ajustes CV individuales en paralelo. Está usando mulitprocessing para que el GIL de python no sea un problema.
Consideraría usar un bosque aleatorio para reducir la cantidad de características que ingresas.
Existe una opción con ExtraTreesRegressor y ExtraTreesClassifier para generar importancias de características. Luego puede usar esta información para ingresar un subconjunto de características en su SVM.
En primer lugar, según el punto de referencia de scikit-learn ( here ), scikit-learn ya es uno de los paquetes de SVM más rápidos, si no más rápidos. Por lo tanto, es posible que desee considerar otras formas de acelerar el entrenamiento.
Según lo sugerido por bavaza, puedes tratar de enhebrar el proceso de entrenamiento. Si está utilizando la clase GridSearchCV de Scikit-learn, puede establecer fácilmente que el argumento n_jobs 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 here puede encontrar un ejemplo de cómo usar la clase.
Alternativamente, puedes echar un vistazo a la biblioteca de aprendizaje de máquinas Shogun here
Shogun está diseñado para el aprendizaje automático a gran escala con envoltorios para muchos paquetes comunes de svm y se implementa en C / C ++ con enlaces para python. Según el punto de referencia de Scikit-learn anterior, su velocidad es comparable a scikit-learn. En otras tareas (distintas a la que demostraron), podría ser más rápido, así que vale la pena intentarlo.
Por último, puede intentar realizar una reducción de dimensión, por ejemplo, utilizando PCA o PCA aleatorizado para reducir la dimensión de sus vectores de características. Eso aceleraría el proceso de entrenamiento. La documentación para las clases respectivas se puede encontrar en estos 2 enlaces: PCA , PCA aleatorizado . Puede encontrar ejemplos sobre cómo usarlos en la sección de ejemplos de Scikit-learn.
Si está interesado en usar solo el kernel RBF (o cualquier otro kernel cuadrático para ese asunto), entonces sugiero usar LIBSVM en MATLAB u Octave . Entreno un modelo de 7000 observaciones y 500 características en aproximadamente 6 segundos.
El truco consiste en utilizar núcleos precalculados que proporciona LIBSVM, y usar algo de álgebra matricial para calcular el kernel en un solo paso en lugar de cortar sobre los datos dos veces. El kernel tarda unos dos segundos en compilarse en lugar de muchos más utilizando 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.
Si su problema está en dos clases, este ajuste de SVM basada en CUDA con scikit-learn es útil:
Sin ir demasiado lejos en la comparación de las bibliotecas SVM, creo que la tarea que está describiendo (validación cruzada) puede beneficiarse del multi-threading real (es decir, ejecutar varias CPU en paralelo). Si está usando CPython , no aprovecha su máquina (probablemente) -multi-core, debido a GIL .
Puede probar otras implementaciones de Python que no tienen esta limitación. Vea PyPy o IronPython si está dispuesto a ir a .NET.
Sugiero ver la implementación del Gradiente de Gradiente Estocástico de Scikit-Learn. La pérdida de bisagra predeterminada es una SVM lineal. He encontrado que es tremendamente rápido.
La implementación de SVM de kernel más escalable que conozco es LaSVM . Está escrito en C y, por lo tanto, está disponible en Python si conoces Cython , ctypes o cffi . Alternativamente puede usarlo desde la línea de comando. Puede usar las utilidades en sklearn.datasets
para cargar datos de conversión de un formato NumPy o CSR en archivos formateados con svmlight que LaSVM puede usar como conjunto de entrenamiento / prueba.