Soporte Vector Machine para Java?
machine-learning artificial-intelligence (4)
Si está interesado en utilizar máquinas de vectores de soporte, hay una guía que está muy orientada para principiantes y que puede serle de utilidad ( http://www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf )
Esa guía es de los mismos tipos de libsvm que es una biblioteca muy madura para máquinas de vectores de soporte ( http://www.csie.ntu.edu.tw/~cjlin/libsvm/ ) y tienen enlaces para Java ( http: //www.csie.ntu.edu.tw/~cjlin/libsvm/#java )
Me gustaría escribir un "monitor inteligente" en Java que envíe una alerta cada vez que detecte problemas de rendimiento inminentes. Mi aplicación Java está escribiendo datos en un formato estructurado en un archivo de registro:
<datetime> | <java-method> | <seconds-to-execute>
Entonces, por ejemplo, si tuviera un método Widget#doSomething(String)
que tomara 812ms ejecutar, se registraría como:
2013-03-24 11:39:21 | Widget#doSomething(String) | 812
A medida que el rendimiento comienza a degradarse (como durante una recolección principal, durante las cargas máximas o si el sistema simplemente se ralentiza hasta el rastreo), los tiempos de ejecución del método comienzan a disminuir; por lo que la columna de la derecha comienza a ver números enormes (en algún momento de 20 a 40 segundos para ejecutar un único método).
En la universidad, para un ejercicio de aprendizaje automático, escribí lo que mi profesor llamó un dicotomizador lineal que tomaba datos de prueba simples (la altura, peso y género de una persona) y "aprendía" a categorizar a una persona como hombre o mujer en función de su altura peso. Luego, una vez que tuvo todos sus datos de entrenamiento, le dimos nuevos datos para ver con qué precisión podía determinar el género.
Creo que la versión multivariada de un dicotomizador lineal es algo llamado máquina de vectores de soporte (SVM) . Si me equivoco, aclare y cambiaré el título de mi pregunta a algo más apropiado. De todos modos , necesito esta aplicación para hacer las siguientes cosas:
- Ejecutar en un "modo de prueba" donde le doy el archivo de registro estructurado de mi aplicación principal de Java (la que deseo monitorear) y toma cada entrada de registro (como se muestra arriba) y lo usa para datos de prueba
- Solo las columnas de
java-method
yseconds-to-execute
son importantes como datos de entrada / prueba; No me importa la fecha y hora
- Solo las columnas de
- Ejecutar en "modo monitor" donde está leyendo activamente nuevos datos de registro del archivo de registro, y utilizando técnicas similares de "aprendizaje automático" para determinar si se avecina una degradación del rendimiento
Es importante tener en cuenta que la columna de seconds-to-execute
no es el único factor importante aquí, ya que he visto tiempos horribles para ciertos métodos durante períodos de rendimiento increíble, y tiempos realmente buenos para otros métodos en momentos en que el servidor parecía estaba a punto de morir y empujar a las margaritas. Entonces, obviamente, ciertos métodos son "ponderados" / más importantes para el rendimiento que otros.
Mi pregunta
- Buscar en Google "dicotomizador lineal" o "máquinas de vectores de soporte" revela algunos libros blancos muy cerebrales, altamente académicos y ultracerebrales que simplemente no tengo la energía mental (ni el tiempo) para consumir, a menos que realmente sean mi único opciones; así que pregunto : ¿hay alguna introducción a este material por parte de un profano o un excelente sitio / artículo / tutorial para construir tal sistema en Java ?
- ¿Hay alguna biblioteca Java de fuente abierta sólida / estable? Solo pude encontrar
jlibsvm
ysvmlearn
pero el primero parece estar en estado beta puro y el último parece ser solo compatible con decisiones binarias (como mi antiguo dicotomizador lineal). Sé que hay Mahout, pero eso se encuentra encima de Hadoop, y no creo que tenga suficientes datos para justificar el tiempo y la energía mental necesarios para configurar mi propio clúster de Hadoop.
¡Gracias por adelantado!
Weka es un popular paquete de aprendizaje automático / minería de datos en Java. Este libro http://guidetodatamining.com/ podría ser útil. En realidad, no se ocupa de SVM, pero ciertamente tiene buenos algoritmos de clasificación, y ciertamente no es para nada esotérico.
Un "monitor inteligente" que describes es exactamente una clasificación de serie temporal.
Hay muchos algoritmos de clasificación. Básicamente todas toman una matriz, donde las filas son observaciones y las columnas son "características" que de alguna manera describen la observación, y un vector de etiqueta de filas de longitud que se valora como 0 o 1. En su problema, una observación podría ser una muestra de minutos , y su vector de etiqueta tendrá un valor de 1 para los períodos de tiempo que experimentan problemas de rendimiento y 0 en caso contrario.
Implícita en esta definición está la necesidad de volver a muestrear sus datos (utilizando el modo / mediana / media si es necesario) de modo que cada observación se defina de manera uniforme, como segundos, minutos u horas.
Generar características es la parte crucial. Probablemente comenzaría con 2 características, los valores brutos y los valores diferenciales (una vez) entre la observación x_i y x_i-1. Definiremos estos para un retraso de 2. Técnicamente haciendo estas 4 características. Cada característica no puede mirar hacia el futuro. Cada característica debe representar lo mismo para cada observación.
Por ejemplo, considere la serie de tiempo de longitud 10:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Si queremos producir un conjunto de características usando lag dos intervalos en el pasado, entonces los primeros dos elementos de la serie temporal se consideran una muestra quemada. No podemos usar las observaciones asociadas con ellos para entrenar el algoritmo.
Los valores brutos , de 8 filas por 2 columnas serían
[[ 1., 0.]
[ 2., 1.],
[ 3., 2.],
[ 4., 3.],
[ 5., 4.],
[ 6., 5.],
[ 7., 6.],
[ 8., 7.]]
Los valores diferenciados
[[ 1., 1.],
[ 1., 1.],
[ 1., 1.],
[ 1., 1.],
[ 1., 1.],
[ 1., 1.],
[ 1., 1.]])
Estos se apilan en columnas. Hay muchas características adicionales que podrías explorar. Rolling mean sería mi próxima elección.
Si desea predecir aún más en el futuro, los datos de su entrenamiento deberían estar más retrasados con respecto al vector de su etiqueta.
Si el rendimiento no es satisfactorio, intente agregar más características eligiendo una media móvil en una ventana más grande o agregue más en el futuro. Un truco ingenioso para mejorar el rendimiento de los algoritmos de series temporales es incluir el valor de la predicción para el intervalo de tiempo anterior.
Ajuste su clasificador en alguna parte temprana de los datos, luego observe su precisión sobre una parte posterior de los datos. Hay muchas métricas para clasificadores que puede usar. Si eliges usar un clasificador que emita probabilidades en lugar de 1/0, tus opciones incluso se ampliarán. (Al igual que los usos de su clasificador).
La precisión y la recuperación son mediciones de rendimiento intuitivas de los clasificadores.
Entrene en la primera (temprana) mitad de sus datos y realice la prueba en la segunda mitad (más adelante).
En cuanto a los algoritmos, examinaría la regresión logística. Solo buscaría en otro lado si el rendimiento no es satisfactorio y ha agotado las opciones de extracción de características.
Mallet parece ser una buena biblioteca para la tarea. Vea este pedacito de los documentos.
Recientemente descubrí JSAT , que parece prometedor.
Existen enfoques más específicos para la clasificación de series de tiempo que tienen explícitamente en cuenta la naturaleza secuencial de las observaciones y etiquetas. Esta es una adaptación de propósito general de clasificación a series de tiempo.
Quizás Apache Spark MLlib lo ayude a:
El SVM lineal es un método estándar para tareas de clasificación a gran escala. Es un método lineal como se describió anteriormente en la ecuación (1), con la función de pérdida en la formulación dada por la pérdida de bisagra:
L (w; x, y): = max {0,1-ywTx}.
Por defecto, las SVM lineales están entrenadas con una regularización L2. También apoyamos la regularización alternativa L1. En este caso, el problema se convierte en un programa lineal.
El algoritmo SVM lineal genera un modelo SVM. Dado un nuevo punto de datos, denotado por x, el modelo hace predicciones basadas en el valor de wTx. Por defecto, si wTx≥0 entonces el resultado es positivo, y negativo de lo contrario.