vectorial support soporte regresion para máquinas maquinas las ejemplos dummies machine-learning libsvm svm

machine-learning - support - svm para regresion



Algunos detalles de implementación para una Máquina de Vector de Soporte(SVM) (4)

En una aplicación particular, necesitaba aprendizaje automático (sé las cosas que estudié en mi curso de pregrado). Utilicé Support Vector Machines y resolví el problema. Funciona bien.

Ahora necesito mejorar el sistema. Los problemas aquí son

  1. Obtengo ejemplos adicionales de entrenamiento cada semana. En este momento, el sistema comienza a capacitarse recientemente con ejemplos actualizados (ejemplos antiguos + ejemplos nuevos). Quiero que sea aprendizaje incremental. Utilizando conocimientos previos (en lugar de ejemplos anteriores) con nuevos ejemplos para obtener un nuevo modelo (conocimiento)

  2. Bien, mis ejemplos de entrenamiento tienen 3 clases. Entonces, cada ejemplo de entrenamiento se ajusta a una de estas 3 clases. Quiero la funcionalidad de la clase "Desconocida". Todo lo que no se ajuste a estas 3 clases debe marcarse como "desconocido". Pero no puedo tratar "Desconocido" como una nueva clase y proporcionar ejemplos para esto también.

  3. Asumiendo, la clase "desconocida" es implementada. Cuando la clase es "desconocida", el usuario de la aplicación ingresa lo que cree que podría ser la clase. Ahora, necesito incorporar la entrada del usuario en el aprendizaje. No tengo idea acerca de cómo hacer esto también. ¿Haría alguna diferencia si el usuario ingresa una nueva clase (es decir, una clase que aún no está en el conjunto de entrenamiento)?

¿Debo elegir un nuevo algoritmo o Support Vector Machines puede hacer esto?

PD: estoy usando la implementación de libsvm para SVM.


  1. Hay algoritmos para entrenar un SVM incrementalmente, pero no creo que libSVM lo implemente. Creo que deberías considerar si realmente necesitas esta característica. No veo ningún problema con su enfoque actual, a menos que el proceso de capacitación sea demasiado lento. Si es así, ¿podría volver a entrenar en lotes (es decir, después de cada 100 nuevos ejemplos)?
  2. Puede hacer que libSVM produzca probabilidades de pertenencia a clase. Creo que esto se puede hacer para la clasificación multiclase, pero no estoy del todo seguro de eso. Tendrá que decidir algún umbral en el que la clasificación no es lo suficientemente segura y luego generar ''Desconocido''. Supongo que algo así como establecer un umbral en la diferencia entre la clase más probable y la segunda más probable lo lograría.
  3. Creo que libSVM se adapta a cualquier cantidad de clases nuevas. Sin embargo, la precisión de su modelo puede sufrir al agregar nuevas clases.

Acabo de escribir mi respuesta usando la misma organización que su pregunta (1., 2., 3).

  1. ¿Pueden las SVM hacer esto, es decir, aprendizaje incremental? Por supuesto, los perceptrones de múltiples capas pueden, debido a que las instancias de entrenamiento subsiguientes no afectan a la arquitectura de red básica, solo causan un ajuste en los valores de las matrices de peso. Pero SVMs? Me parece que (en teoría) una instancia de entrenamiento adicional podría cambiar la selección de los vectores de soporte. Pero de nuevo, no sé.

  2. Creo que puede resolver este problema con bastante facilidad configurando LIBSVM en uno contra muchos, es decir, como un clasificador de una sola clase . Las SVM son clasificadores de una sola clase; la aplicación de una SVM para multiclases significa que ha sido codificada para realizar múltiples clasificaciones paso a paso de uno contra muchos, pero de nuevo el algoritmo se entrena (y prueba) una clase a la vez. Si hace esto, lo que queda después de la ejecución paso a paso contra el conjunto de prueba, es "desconocido"; en otras palabras, cualquier información que no se clasifique después de realizar múltiples clasificaciones secuenciales de una clase, es por definición en ese ''desconocido'' '' clase.

  3. ¿Por qué no hacer que el usuario adivine una característica (es decir, simplemente otra variable dependiente)? La única otra opción es convertirla en la etiqueta de la clase en sí, y no quieres eso. Así que, por ejemplo, agregaría una columna a su matriz de datos "conjetura de clase de usuario", y simplemente la rellenaría con algún valor que probablemente no tenga ningún efecto para esos puntos de datos que no estén en la categoría "desconocido" y por lo tanto para los que el usuario no ofrecerá una adivinanza: este valor podría ser ''0'' o ''1'', pero realmente depende de cómo haya escalado y normalizado sus datos).


Aunque esta pregunta probablemente esté desactualizada, me siento obligado a dar algunos pensamientos adicionales.

  1. Dado que su primera pregunta ha sido respondida por otros (no hay una SVM lista para producción que implemente el aprendizaje incremental, aunque sea posible), la omitiré. ;)

  2. Agregar ''Desconocido'' como clase no es una buena idea. Dependiendo de su uso, las razones son diferentes.

    • Si está utilizando la clase ''Desconocido'' como una etiqueta para "esta instancia no ha sido clasificada, pero pertenece a una de las clases conocidas", entonces su SVM está en un gran problema. La razón es que libsvm crea varios clasificadores binarios y los combina. Entonces, si tiene tres clases, digamos A, B y C, SVM construye el primer clasificador binario dividiendo los ejemplos de entrenamiento en "clasificados como A" y "cualquier otra clase". Este último obviamente contendrá todos los ejemplos de la clase ''Desconocido''. Al intentar construir un hiperplano, los ejemplos en ''Desconocido'' (que realmente pertenecen a la clase ''A'') probablemente harán que el SVM construya un hiperplano con un margen muy pequeño y reconocerá mal las instancias futuras de A, es decir, su rendimiento de generalización disminuirá Esto se debe al hecho de que SVM intentará construir un hiperplano que separe la mayoría de las instancias de A (oficialmente etiquetadas como ''A'') en un lado del hiperplano y algunas instancias (aquellas etiquetadas oficialmente como ''Desconocidas'') en el otro lado .

    • Se produce otro problema si está utilizando la clase ''Desconocido'' para almacenar todos los ejemplos, cuya clase todavía no conoce la SVM. Por ejemplo, SVM conoce las clases A, B y C, pero recientemente obtuvo datos de ejemplo para dos nuevas clases D y E. Como estos ejemplos no están clasificados y las nuevas clases no son conocidas por SVM, es posible que desee almacenar temporalmente ellos en ''Desconocido''. En ese caso, la clase ''Desconocido'' puede causar problemas, ya que posiblemente contenga ejemplos con una enorme variación en los valores de sus características. Eso hará que sea muy difícil crear buenos hiperplanos de separación y, por lo tanto, el clasificador resultante reconocerá mal las nuevas instancias de D o E como ''Desconocido''. Probablemente la clasificación de las nuevas instancias que pertenecen a A, B o C se verá obstaculizada también.

    En resumen: la introducción de una clase ''Desconocida'' que contiene ejemplos de clases conocidas o ejemplos de varias clases nuevas dará como resultado un clasificador pobre. Creo que es mejor ignorar todas las instancias no clasificadas al entrenar el clasificador.

  3. Yo recomendaría, que resuelvan este problema fuera del algoritmo de clasificación. Me pidieron esta función e implementé una sola página web, que muestra una imagen del objeto en cuestión y un botón para cada clase conocida. Si el objeto en cuestión pertenece a una clase que aún no se conoce, el usuario puede completar otro formulario para agregar una nueva clase. Si regresa a la página de clasificación, aparecerá otro botón mágico para esa clase. Después de que las instancias se hayan clasificado, se pueden usar para entrenar el clasificador. (Utilicé una base de datos para almacenar las clases conocidas y referenciar qué ejemplo pertenece a qué clase. Implementé una función de exportación para preparar los datos SVM-ready).


Es probable que su primer artículo sea el más difícil, ya que esencialmente no existen buenas implementaciones incrementales de SVM.

Hace unos meses, también investigué algoritmos SVM en línea o incrementales . Desafortunadamente, el estado actual de las implementaciones es bastante escaso. Todo lo que encontré fue un ejemplo de Matlab , OnlineSVR (un proyecto de tesis que solo implementa el soporte de regresión) y SVMHeavy (solo soporte de clases binarias).

No he usado ninguno de ellos personalmente. Todos parecen estar en la etapa de "juguete de investigación". Ni siquiera pude hacer que SVMHeavy compilara.

Por ahora, probablemente pueda salirse con la suya haciendo entrenamientos periódicos por lotes para incorporar actualizaciones. También uso LibSVM, y es bastante rápido, por lo que podría ser un buen sustituto hasta que se implemente una versión incremental adecuada.

Tampoco creo que SVM pueda modelar el concepto de una muestra "desconocida" por defecto. Por lo general, funcionan como una serie de clasificadores booleanos, por lo que una muestra termina positivamente clasificada como algo, incluso si esa muestra es drásticamente diferente de cualquier cosa vista anteriormente. Una solución posible sería modelar los rangos de sus características y generar al azar muestras que existan fuera de estos rangos, y luego agregarlas a su conjunto de capacitación.

Por ejemplo, si tiene un atributo llamado "color", que tiene un valor mínimo de 4 y un valor máximo de 123, puede agregarlos a su conjunto de entrenamiento

[({''color'':3},''unknown''),({''color'':125},''unknown'')]

para darle a tu SVM una idea de lo que significa un color "desconocido".