sklearn score scikit poly linearsvc learn example decision_function clf python machine-learning scikit-learn svm

python - score - sklearn svm kernel list



¿El SVM en sklearn admite aprendizaje incremental(en línea)? (6)

Aspectos técnicos

La respuesta corta es no . La implementación de Sklearn (así como la mayoría de las otras existentes) no es compatible con la capacitación en SVM en línea. Es posible entrenar SVM de forma incremental, pero no es una tarea tan trivial.

Si desea limitarse al caso lineal, la respuesta es , ya que sklearn le proporciona el Descenso de gradiente estocástico (SGD), que tiene la opción de minimizar el criterio de SVM.

También puede probar la biblioteca pegasos, que es compatible con la formación en SVM en línea.

Aspectos teóricos

El problema de la adaptación de tendencias es actualmente muy popular en la comunidad de ML. Como dijo @Raff, se llama deriva del concepto , y tiene numerosos enfoques, que a menudo son tipos de metamodelos, que analizan "cómo se comporta la tendencia" y cambian el modelo ML subyacente (por ejemplo forzándolo a volver a entrenarse en el subconjunto) de los datos). Entonces tienes dos problemas independientes aquí:

  • el tema de la capacitación en línea, que es puramente técnico, y puede ser abordado por SGD u otras bibliotecas aparte de sklearn
  • concepto deriva, que actualmente es un tema candente y no solo tiene respuestas de trabajo Hay muchas posibilidades, hipótesis y pruebas de conceptos, mientras que no hay una manera generalmente aceptada de tratar con este fenómeno, de hecho muchas disertaciones de doctorado en ML son currenlly basado en este problema

Actualmente estoy en el proceso de diseñar un sistema de recomendación para artículos de texto (un caso binario de ''interesante'' o ''no interesante''). Una de mis especificaciones es que debe actualizarse continuamente a las tendencias cambiantes.

Por lo que puedo decir, la mejor manera de hacerlo es utilizar un algoritmo de aprendizaje automático que sea compatible con el aprendizaje incremental / en línea .

Algoritmos como Perceptron y Winnow admiten el aprendizaje en línea, pero no estoy completamente seguro de Support Vector Machines. ¿La biblioteca de python scikit-learn admite el aprendizaje en línea y, de ser así, es una máquina de vectores de soporte uno de los algoritmos que puede hacer uso de ella?

Obviamente no estoy completamente atado al uso de máquinas de vectores de soporte, pero generalmente son el algoritmo de ir a la clasificación binaria debido a su rendimiento general. Estaría dispuesto a cambiar a lo que mejor se adapte al final.


SGD para tareas de aprendizaje por lotes normalmente tiene una tasa de aprendizaje decreciente y repasa el entrenamiento varias veces. Por lo tanto, para el aprendizaje puramente en línea, asegúrese de que learning_rate está establecido en ''constante'' en sklearn.linear_model.SGDClassifier () y eta0 = 0.1 o cualquier valor deseado. Por lo tanto, el proceso es el siguiente:

clf= sklearn.linear_model.SGDClassifier(learning_rate = ''constant'', eta0 = 0.1, shuffle = False, n_iter = 1) # get x1, y1 as a new instance clf.partial_fit(x1, y1) # get x2, y2 # update accuracy if needed clf.partial_fit(x2, y2)


Si bien existen algoritmos en línea para SVM, ha llegado a ser importante especificar si desea kernel o SVM lineales, ya que se han desarrollado muchos algoritmos eficientes para el caso especial de SVM lineales.

Para el caso lineal, si utiliza el clasificador SGD en scikit-learn con la pérdida de bisagra y la regularización L2, obtendrá un SVM que se puede actualizar en línea / incremental. Puede combinar esto con transformaciones de características que se aproximan a un kernel para obtener una similar a una SVM de kernel en línea.

Una de mis especificaciones es que debe actualizarse continuamente a las tendencias cambiantes.

Esto se conoce como deriva del concepto, y no será manejado bien por un simple SVM en línea. Usar el clasificador PasivoAgresivo probablemente te dará mejores resultados, ya que su tasa de aprendizaje no disminuye con el tiempo.

Suponiendo que recibe retroalimentación durante el entrenamiento / correr, puede intentar detectar disminuciones en la precisión con el tiempo y comenzar a entrenar un nuevo modelo cuando la precisión comienza a disminuir (y cambiar al nuevo cuando crea que se ha vuelto más preciso). JSAT tiene 2 métodos de detección de deriva (ver jsat.driftdetectors ) que se pueden usar para rastrear la precisión y alertarlo cuando ha cambiado.

También tiene más métodos lineales y kernel en línea.

(Nota parcial: soy el autor de JSAT).


Si está interesado en el aprendizaje en línea con la deriva del concepto, aquí hay algunos trabajos previos

  1. Aprendizaje bajo Concept Drift: una descripción general https://arxiv.org/pdf/1010.4784.pdf

  2. El problema de la deriva del concepto: definiciones y trabajo relacionado http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.58.9085&rep=rep1&type=pdf

  3. Una encuesta sobre la adaptación conceptual de deriva http://www.win.tue.nl/~mpechen/publications/pubs/Gama_ACMCS_AdaptationCD_accepted.pdf

  4. MOA Concept Drift Estrategias de aprendizaje activo para transmisión de datos http://videolectures.net/wapa2011_bifet_moa/

  5. Una corriente de algoritmos para Concept Drift http://people.cs.georgetown.edu/~maloof/pubs/maloof.heilbronn12.handout.pdf

  6. RIACHUELOS DE DATOS MINEROS CON CONCEPT DRIFT http://www.cs.put.poznan.pl/dbrzezinski/publications/ConceptDrift.pdf

  7. Análisis de datos de series de tiempo con procesamiento de flujo y aprendizaje automático http://www.ibmbigdatahub.com/blog/analyzing-time-series-data-stream-processing-and-machine-learning


Tal vez soy yo ingenuo, pero creo que vale la pena mencionar cómo actualizar realmente el clasificador SGD de sci-kit cuando presentas tus datos de forma incremental:

clf = linear_model.SGDClassifier() x1 = some_new_data y1 = the_labels clf.partial_fit(x1,y1) x2 = some_newer_data y2 = the_labels clf.partial_fit(x2,y2)


Una forma de escalar SVM podría dividir su gran conjunto de datos en lotes que pueden ser consumidos de manera segura por un algoritmo SVM, luego encontrar vectores de soporte para cada lote por separado y luego construir un modelo SVM resultante en un conjunto de datos que consta de todos los vectores de soporte encontrados todos los lotes

Se puede actualizar a las tendencias manteniendo una ventana de tiempo cada vez que ejecute su canal de capacitación. Por ejemplo, si realiza su capacitación una vez al día y hay suficiente información en los datos históricos de un mes, cree su conjunto de datos de capacitación a partir de los datos históricos obtenidos en los últimos 30 días.