¿Es posible agregar datos de capacitación a los modelos SVM existentes?


14

Estoy usando libsvm y noté que cada vez que llamo a svmtrain (), creo un nuevo modelo y parece que no hay opción para poner datos en un modelo existente. ¿Es esto posible hacer sin embargo? ¿No estoy viendo este aspecto en libsvm?


No estoy seguro de lo que quieres decir con 'poner datos en un modelo existente'? ¿Puedes dar un ejemplo de alguna otra técnica (no SVM) que te permita hacer esto? Tomemos por ejemplo la regresión logística; Si agrega datos nuevos, obtendrá un nuevo conjunto de coeficientes reentrenados en el conjunto existente sin referencia a qué datos son 'nuevos' o 'antiguos', son solo datos de entrenamiento. Supongo que si está utilizando un solucionador de tipo de descenso de gradiente, podría ahorrar tiempo inicializando en los valores optimizados previamente, que probablemente estarán cerca de la nueva solución. ¿Es esto lo que quieres decir?
Bogdanovist

Respuestas:


17

Parece que está buscando un algoritmo de aprendizaje "incremental" o "en línea". Estos algoritmos le permiten actualizar un clasificador con nuevos ejemplos, sin volver a entrenar todo desde cero.

Definitivamente es posible con máquinas de vectores de soporte, aunque creo que libSVM actualmente no lo admite. Puede valer la pena echar un vistazo a otros paquetes que sí lo ofrecen, incluidos

PD: @Bogdanovist: Hay una literatura bastante extensa sobre esto. kNN es obviamente y trivialmente incremental. Uno podría convertir (algunos) clasificadores bayesianos en clasificadores incrementales almacenando recuentos en lugar de probabilidades. STAGGER, AQ * y algunos (pero no todos) de la familia ID * de algoritmos de árbol de decisión también son incrementales, fuera de mi cabeza.


1
Interesante, gracias por el aviso. Ya había visto el término 'en línea' antes, pero no me había dado cuenta de la importancia técnica (pensé que literalmente significaba 'can haz internetz').
Bogdanovist

¡Encantado de ayudar! Debería haber mencionado esto anteriormente, pero algunos algoritmos en línea / incrementales realmente dan más peso a los ejemplos "más nuevos", que pueden o no ser útiles, dependiendo de su aplicación (por ejemplo, excelente para predecir temas de Twitter, menos sorprendente para el cáncer investigación).
Matt Krause

12

La mayoría de las utilidades SVM en línea / incrementales son para núcleos lineales y supongo que no es tan difícil como lo es para los núcleos no lineales.

Algunas de las notables herramientas SVM en línea / incrementales actualmente disponibles:
+ LaSVM de Leon Bottous : admite núcleos tanto lineales como no lineales. Código C ++
+ LaRank de Bordes : admite núcleos tanto lineales como no lineales. Código C ++. Parece que el enlace está roto ahora :-(
+ Código incremental y decremental de Gert Cauwenberghs : admite núcleos lineales y no lineales. Código Matlab.
+ Aprendizaje SVM incremental de Chris Diehl : admite núcleos lineales y no lineales. Código Matlab.
+ Alistair SVMHeavy de Shilton : solo clasificación y regresión binarias. Código C ++
+ OnlineSVR de Francesco Parrella: Solo regresión. Matlab y C ++.
+ Pegasos : tanto lineales como no lineales. C y código Matlab. Una interfaz java .
+ Vowpal Wabbit de Langford : No estoy seguro :-(
+ MCSVM de Koby Crammer : tanto lineal como no lineal. Código C

Se puede encontrar una lista más actualizada en mi respuesta de Quora .


(+1) Bienvenido al sitio. ¡Esa es una lista bastante exhaustiva! :)
cardenal

4

Otra posibilidad es la siembra alfa . No sé si libSVM lo admite. La idea es dividir una gran cantidad de datos de entrenamiento en fragmentos. Luego entrenas un SVM en el primer fragmento. Como los vectores de soporte resultantes no son más que algunas de las muestras de sus datos, los toma y los usa para entrenar su SVM con el siguiente fragmento. Además, utiliza esa SVM para calcular una estimación inicial de los valores alfa para la próxima iteración (siembra). Por lo tanto, los beneficios son dobles: cada uno de los problemas es menor y, a través de la inicialización inteligente, convergen aún más rápido. De esta manera, simplifica un gran problema para resolver secuencialmente una serie de pasos más simples.


¿hay alguna biblioteca por ahí aplicando este método?
d.putto

aparentemente libsvm ya lo hace, o al menos alguna variante del algoritmo work.caltech.edu/~htlin/program/libsvm
jpmuc

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.