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

Actualmente estoy en el proceso de diseñar un sistema de recomendación de 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 hacer esto es hacer uso del algoritmo de aprendizaje automático que admite el aprendizaje incremental / en línea .

Algoritmos como Perceptron y Winnow admiten el aprendizaje en línea, pero no estoy completamente seguro de las máquinas de vectores de soporte. ¿La biblioteca de python de scikit-learn es compatible con el aprendizaje en línea y, en caso afirmativo, es una máquina de vectores de soporte uno de los algoritmos que pueden utilizarlo?

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

Si bien existen algoritmos en línea para SVM, es importante especificar si desea SVM lineales o de núcleo, ya que se han desarrollado muchos algoritmos eficientes para el caso especial de SVM lineales.

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

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

Esto se conoce como desviación del concepto y no será manejado bien por un simple SVM en línea. El uso del clasificador PassiveAggresive probablemente le dará mejores resultados, ya que la velocidad de aprendizaje no disminuye con el tiempo.

Suponiendo que reciba retroalimentación mientras entrena / corre, puede intentar detectar disminuciones en la precisión con el tiempo y comenzar a entrenar un nuevo modelo cuando la precisión comience 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 (vea jsat.driftdetectors ) que pueden usarse para rastrear la precisión y alertarle cuando haya cambiado.

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

(Nota de sesgo: Soy el autor de JSAT).

Tal vez sea yo ingenuo, pero creo que vale la pena mencionar cómo actualizar el clasificador SGD de sci-kit cuando presenta sus datos de manera 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) 

Aspectos técnicos

La respuesta corta es no . La implementación de Sklearn (como la mayoría de los otros existentes) no admite la capacitación en línea de SVM. Es posible entrenar SVM de una manera incremental, pero no es una tarea tan trivial.

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

También puede probar la biblioteca de pegasos, que admite la capacitación en línea de SVM.

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 cambio de concepto y tiene numerosos enfoques, que a menudo son tipos de metamodelos, que analizan “cómo se está comportando la tendencia” y cambian el modelo de ML subyacente (por ejemplo, forzándolo a volver a entrenarse en el subconjunto de los datos). Así que aquí tienes dos problemas independientes:

  • El problema de la capacitación en línea, que es puramente técnico, y puede ser abordado por SGD u otras bibliotecas además de sklearn
  • La deriva de conceptos, que actualmente es un tema candente y no tiene respuestas simples. Hay muchas posibilidades, hipótesis y pruebas de conceptos, mientras que no hay una forma generalmente aceptada de tratar este fenómeno, de hecho, muchas disertaciones de doctorado en ML son actuales. Basado en este tema.

Si está interesado en el aprendizaje en línea con la deriva de conceptos, aquí hay algunos trabajos anteriores.

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

  2. El problema del concepto de deriva: 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 a la deriva del concepto 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. Un flujo de algoritmos para la deriva de conceptos http://people.cs.georgetown.edu/~maloof/pubs/maloof.heilbronn12.handout.pdf

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

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

La SGD para tareas de aprendizaje por lotes normalmente tiene una tasa de aprendizaje decreciente y se repite 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) 

Una forma de escalar SVM podría dividir su gran conjunto de datos en lotes que un algoritmo SVM puede consumir de manera segura, luego encontrar vectores de soporte para cada lote por separado y luego construir un modelo SVM resultante en un conjunto de datos que consiste en todos los vectores de soporte que se encuentran en Todos los lotes.

La actualización a las tendencias podría lograrse manteniendo una ventana de tiempo cada vez que ejecute su línea de capacitación. Por ejemplo, si realiza su entrenamiento una vez al día y hay suficiente información en los datos históricos de un mes, cree su conjunto de datos de formación a partir de los datos históricos obtenidos en los últimos 30 días.