Estoy tratando de encontrar un método para la regresión de secuencias de números de prueba.

Mi sistema bajo pruebas produce una gran cantidad de números para cada versión del sistema (por ejemplo, altura, ancho, profundidad, etc.). Estos números varían de una versión a otra de manera desconocida. Dada una secuencia de versiones "buenas" y una versión "nueva", me gustaría encontrar las secuencias más anormales.

Ejemplo:

Versión "buena":

version    width   height   depth
   1        123      43      302 
   2        122      44      304
   3        120      46      300
   4        124      45      301

"Nueva versión:

   5        121      60      305

En este caso, obviamente, me gustaría encontrar la secuencia de altura porque el valor 60 se destaca más que el ancho o la profundidad.

Mi enfoque actual calcula la media y la desviación estándar de cada secuencia de los casos buenos y para el número de una nueva versión calcula la probabilidad de que este número sea parte de esta secuencia (en base a la media conocida y la desviación estándar). Esto funciona ... más o menos.

Los números en mis secuencias no son necesariamente gaussianos distribuidos alrededor de un valor medio, pero a menudo son bastante constantes y solo a veces producen un valor atípico que también parece ser bastante constante, e. sol. 10, 10, 10, 10, 10, 5, 10, 10, 10, 5, 10, 10, 10. En este caso, solo en función de la media y la desviación estándar, el valor 10 no sería 100% probable de estar en el secuencia, y el valor 5 sería bastante improbable.

Pensé en usar un enfoque de histograma y dudé allí para preguntar aquí primero. El problema con un histograma sería que necesitaría almacenar mucha información para cada secuencia (en contraste con solo una media y una desviación estándar).

El siguiente aspecto en el que pensé fue que estoy bastante seguro de que este tipo de tarea no es nueva y que probablemente ya hay soluciones que se adaptarían bien a mi situación; pero no encontré mucho en mi investigación.

Encontré una biblioteca como PyBrain que a primera vista parece procesar secuencias numéricas y luego aparentemente trata de analizarlas con una red neuronal simulada. No estoy seguro de si esto sería un enfoque para mí (y nuevamente parece que tendría que almacenar una gran cantidad de datos para cada secuencia numérica, como una red neuronal completa).

Entonces mi pregunta es esta:

¿Existe una técnica, un algoritmo o una disciplina científica que me ayudaría a analizar secuencias numéricas para encontrar anomalías (en un último valor)? Preferiblemente mientras se almacenan solo pequeñas cantidades de datos por secuencia ;-)

Para implementaciones concretas, preferiría Python, pero también sería bienvenido tener sugerencias sobre otros lenguajes.

12
Alfe 17 feb. 2017 a las 18:49

4 respuestas

La mejor respuesta

Podría usar una técnica de regresión llamada proceso Gaussiano (GP) para aprender la curva y luego aplicar el proceso gaussiano al siguiente ejemplo en su secuencia.

Dado que un médico de cabecera no solo le da una estimación para el objetivo, sino también una confianza, puede establecer un umbral basado en la confianza para determinar qué es un valor atípico.

Para darse cuenta de esto existen varias cajas de herramientas (scikits.learn, shogun, ...) pero lo más probable es que sea GPy. En el siguiente cuaderno se describe muy bien un ejemplo de regresión 1d que puede ajustar para iniciar su tarea:

http://nbviewer.jupyter.org/github/SheffieldML/notebook/blob/master/GPy/basic_gp.ipynb

1
Soeren Sonnenburg 23 feb. 2017 a las 16:21

¿Existe una técnica, un algoritmo o una disciplina científica que me ayude a analizar secuencias numéricas para encontrar anomalías (en un último valor)?

La eliminación científica que está buscando se llama detección de valores atípicos / detección de anomalías. Hay muchas técnicas y algoritmos que puede usar. Como punto de partida, quizás eche un vistazo a la wikipedia aquí (detección de valores atípicos) y < a href = "https://en.wikipedia.org/wiki/Anomaly_detection" rel = "nofollow noreferrer"> aquí (Detección de anomalías) . También hay una pregunta similar sobre stats .stackexchange.com y uno en datascience.stackexchange.com que se centra en python.

También debe pensar en lo que es peor en su caso, falsos positivos (error de tipo 1) o falsos negativos (error de tipo 2), ya que la disminución del porcentaje de uno de estos tipos de error aumenta el porcentaje del otro.

EDITAR: dado su requisito con múltiples picos en algunos casos, distribuciones planas en otros casos, un algoritmo como este podría funcionar:

1.) cuente el número de ocurrencias de cada número en su secuencia, y coloque el recuento en un contenedor que corresponda a ese número (ancho del contenedor inicial = 1)

2.) iterar a través de los contenedores: si un solo contenedor cuenta más que, por ejemplo, 10% (parámetro a) del número total de valores en su secuencia, marque los números de ese bin como "buenos valores"

3.) aumente el ancho del contenedor en 1 y repita los pasos 1 y 2

4.) repita los pasos 1-3 hasta, p. 90% (parámetro b) de los números en su secuencia están marcados como "buenos valores"

5.) deje que los casos de prueba para los valores incorrectos fallen

Este algoritmo debería funcionar para casos como:

  • un solo pico grande con algunos valores atípicos

  • múltiples picos grandes y algunos valores atípicos en el medio

  • Una distribución plana con una concentración en una determinada región (o en varias regiones)

  • una secuencia numérica donde todos los números son iguales

Los parámetros ayb deben ajustarse a sus necesidades, pero creo que eso no debería ser difícil.

Nota : para comprobar a qué contenedor pertenece un valor, puede utilizar el operador de módulo (%), p. ej. si el tamaño del contenedor es 3, y tiene los valores 475,476,477,478,479, nombre el contenedor de acuerdo con el valor donde su módulo con el tamaño del contenedor es cero -> 477% 3 = 0 -> ponga 477, 478 y 479 en el contenedor 477.

1
Community 13 abr. 2017 a las 12:50

Me pregunto si diferentes columnas en sus datos se pueden tratar de diferentes maneras. ¿Es apropiado, por ejemplo, tratar el ancho con un cheque "cercano a la media"; otra columna con "valor visto en un conjunto de buenos ejemplos"; una tercera columna puede tratarse con "En el grupo existente de K-significa agrupación de buenos ejemplos".

Puede calificar para cada columna y marcar cualquier valor nuevo que tenga una o más columnas que no se consideren adecuadas, e indicar por qué .

Hmm, no está restringido a columnas individuales; si, por ejemplo, existe alguna relación entre los valores de las columnas, entonces eso también podría verificarse, tal vez el ancho por la altura es limitada; o el volumen tiene límites.

Tiempo: puede ser que los valores sucesivos solo puedan desviarse de alguna manera dada por algún valor: si, por ejemplo, los lados fueron continuamente modificados por algún robot y el tiempo entre mediciones fue lo suficientemente corto, entonces eso limitaría los valores delta entre lecturas sucesivas a lo que el mecanismo robótico podría producir cuando funciona correctamente.

Supongo que gran parte de esta respuesta es utilizar cualquier conocimiento que tenga sobre la fuente de datos para ayudar.

0
Paddy3118 18 feb. 2017 a las 10:35

No estoy seguro si te entiendo correctamente, pero creo que quieres predecir si una muestra presentada (después de experimentar una secuencia de ejemplos anteriores) es anómala o no. ¿Por lo tanto, implica algún tipo de dependencia temporal de la nueva muestra?

Si tienes muchos datos de entrenamiento i. mi. (cientos o miles de) ejemplos de secuencias buenas y malas (etiquetadas), entonces es posible que pueda entrenar una arquitectura neuronal para clasificar si el 'siguiente elemento en la secuencia' es anómalo o no. Podría entrenar una arquitectura LSTM (memoria a largo plazo) que se generalizaría sobre las secuencias de entrada para clasificar con precisión la nueva muestra presentada a la arquitectura.

Los LSTM estarán disponibles en cualquier buena biblioteca de redes neuronales y básicamente ejecutará una rutina general de aprendizaje supervisado. Hay tutoriales sobre esto en Internet y en cualquier buen libro de aprendizaje automático (ML).

Como siempre en ML, ¡tenga cuidado de no ajustarse demasiado!

0
rnoodle 26 feb. 2017 a las 00:42