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?
14
Respuestas:
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.
fuente
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 .
fuente
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.
fuente
Aquí puede encontrar otra opción si busca una solución "incremental" ...
Incremental liblinear
Una extensión de LIBLINEAR que permite el aprendizaje incremental.
fuente