Aprendizaje automático: características de ingeniería a partir de datos de fecha / hora

45

¿Cuáles son las mejores prácticas comunes para manejar los datos de tiempo para la aplicación de aprendizaje automático?

Por ejemplo, si en el conjunto de datos hay una columna con marca de tiempo del evento, como "2014-05-05", ¿cómo puede extraer características útiles de esta columna si las hay?

¡Gracias por adelantado!

Igor Bobriakov
fuente

Respuestas:

44

Comenzaría graficando la variable de tiempo frente a otras variables y buscando tendencias.

Por ejemplo

ingrese la descripción de la imagen aquí

En este caso hay una tendencia semanal periódica y una tendencia al alza a largo plazo. Por lo tanto, desearía codificar dos variables de tiempo:

  • day_of_week
  • absolute_time

En general

Hay varios marcos de tiempo comunes sobre los que ocurren las tendencias:

  • absolute_time
  • day_of_year
  • day_of_week
  • month_of_year
  • hour_of_day
  • minute_of_hour

Busque tendencias en todos estos.

Tendencias extrañas

Busque tendencias extrañas también. Por ejemplo, puede ver tendencias raras pero persistentes basadas en el tiempo:

  • is_easter
  • is_superbowl
  • is_national_emergency
  • etc.

Esto a menudo requiere que haga una referencia cruzada de sus datos con alguna fuente externa que asigne eventos al tiempo.

¿Por qué graficar?

Hay dos razones por las que creo que graficar es tan importante.

  • Tendencias extrañas
    Si bien las tendencias generales se pueden automatizar con bastante facilidad (solo agréguelas cada vez), las tendencias extrañas a menudo requerirán un ojo humano y conocimiento del mundo para encontrarlas. Esta es una de las razones por las que hacer gráficos es tan importante.

  • Errores de datos
    Con demasiada frecuencia, los datos contienen errores graves. Por ejemplo, es posible que las fechas se hayan codificado en dos formatos y que solo uno de ellos se haya cargado correctamente en su programa. Hay una miríada de tales problemas y son sorprendentemente comunes. Esta es la otra razón por la que creo que la representación gráfica es importante, no solo para series de tiempo, sino para cualquier dato.

Ben Haley
fuente
7

Divida los datos en ventanas y encuentre características para esas ventanas, como coeficientes de autocorrelación, wavelets, etc. y use esas características para aprender.

Por ejemplo, si tiene datos de temperatura y presión, divídalos en parámetros individuales y calcule características como el número de mínimos locales en esa ventana y otras, y use estas características para su modelo.

Gurpreet Mohaar
fuente
7

Una cosa más a considerar, más allá de todo lo que dijo Ben Haley, es convertir a la hora local del usuario . Por ejemplo, si está tratando de predecir algo que ocurre alrededor de las 8 p.m. para todos los usuarios, si mira la hora UTC, será más difícil predecirlo.

Amir
fuente
6

En varios casos, los datos y eventos dentro de una serie temporal son estacionales. En tales casos, el mes y el año del evento importan mucho. Por lo tanto, en tales escenarios, puede usar variables binarias para representar si el evento es durante un mes / año determinado o no.

Espero que esto responda a su pregunta. Si no es amable, sea un poco más específico sobre qué es exactamente lo que está tratando de lograr

show_stopper
fuente
4

Como Ben y Nar explicaron amablemente, dividir el objeto de fecha y hora en cubos de partes de fecha y hora ayudaría a detectar tendencias estacionales, donde el objeto de fecha y hora completo (y generalmente aún peor).

No mencionó ningún algoritmo de aprendizaje automático específico que le interese, pero en caso de que también le interese la agrupación basada en la distancia, como k-means, generalizaría el objeto de fecha y hora en el formato de tiempo unix . Esto permitiría una comparación de distancia numérica simple para el algoritmo, simplemente indicando qué tan lejos están los valores de 2 fechas.

En su ejemplo, generalizaría el valor de solo fecha 2014-05-05 a 1399248000 (la hora de Unix que representa el inicio del 5 de mayo de 2014, UTC).

[Se podría argumentar que puede lograrlo agrupando la fecha y hora en cada parte posible de fecha y hora ... pero eso aumentaría significativamente las dimensiones de su conjunto de datos. Por lo tanto, sugeriría combinar el tiempo unix, para medir distancias y algunos de los intervalos de fecha y hora]

mork
fuente
3

Ben está hablando de las características estáticas y hace uso de las características de la marca de tiempo.

Como extensión, presentaré las características de retraso , no estoy hablando de las series temporales crudas, sino de los agregados.

La parte más mística es que el valor futuro no se ve para nosotros, ¿cómo podemos usar esas características agregadas en los datos de capacitación?

Un pequeño ejemplo: hay datos de consumo eléctrico anual de 1991 a 2015, quiero predecir el consumo eléctrico en los próximos 5 años, 2016 a 2020. Calcularé el promedio móvil de consumo eléctrico de los últimos 5 años como los valores de características de 2020, pero el 2016 a 2020 es desconocido para nosotros, por lo que lideramos (en oposición al retraso) la serie temporal de 5 años, hagamos el promedio móvil de 2010 a 2015, luego usemos este valor como valores de características de 2020. Por lo tanto, podemos construir los datos de características de los próximos 5 años.

El siguiente paso es simplemente usar la función de movimiento (contar \ mean \ median \ min \ max.etc) y probar diferentes ventanas, ¡entonces construirá muchas características!

Wolfe
fuente
2

Dependiendo de lo que le interese con la información de fecha / hora, es posible que solo desee agruparla. Por ejemplo, si está interesado en la distancia desde un punto de partida (por ejemplo, 1 de enero de 2015) y desea medirlo en meses, simplemente lo codificaría como el mes 1 (del 1 al 31 de enero de 2015), 2 (1 al 28 de febrero de 2015), 3, 4, 5, 6, etc. Dado que la distancia entre las fechas de inicio es aproximadamente la misma, esto representa la distancia de tiempo en un formato continuo y directo. Y digo continuo porque puedes decir el mes 6.5 y saber que es a mediados de junio de 2015. Entonces no tienes que preocuparte por la codificación de fecha real y puedes usar todos tus métodos de clasificación típicos.

Si desea medir en días, sé que MySql tiene una función 'to_days', si es que la usa para extraer datos antes de la clasificación. Python probablemente tenga algo similar, o use el formato de tiempo unix sugerido por mork.

¡Espero que esto ayude!

pmp
fuente
1

Trace gráficos con diferentes variaciones de tiempo contra la variable de resultado para ver su impacto. Puede usar mes, día, año como características separadas y dado que el mes es una variable categórica, puede probar un diagrama de caja / bigote y ver si hay algún patrón. Para variables numéricas, podría usar un diagrama de dispersión.

RAM
fuente
1

No sé si esta es una práctica común / mejor, pero es otro punto de vista del asunto.

Si tiene, digamos, una fecha, puede tratar cada campo como una "variable de categoría" en lugar de una "variable continua". El día tendría un valor en el conjunto {1, 2 ..., 31}, el mes tendría un valor en {1, ..., 12} y, para el año, usted elige un valor mínimo y un valor máximo y construir un conjunto.

Luego, como los valores numéricos específicos de días, meses y años pueden no ser útiles para encontrar tendencias en los datos, use una representación binaria para codificar los valores numéricos, siendo cada bit una característica. Por ejemplo, el mes 5 sería0 0 0 0 1 0 0 0 0 0 0 0 (11 0's a a 1 en 5ta posición, cada bit es una característica)

Entonces, teniendo, por ejemplo, 10 años en el "conjunto del año", una fecha se transformaría en un vector de 43 características (= 31 + 12 + 10). Usando "vectores dispersos", la cantidad de características no debería ser un problema.

Algo similar podría hacerse para los datos de tiempo, día de la semana, día del mes ...

Todo depende de la pregunta que desee que responda su modelo de aprendizaje automático.

Paco Barter
fuente
Esto no logra capturar las relaciones que probablemente existan, como que los días 14 y 15 del mes son "similares". En la medida en que creas que cada día es literalmente diferente, también crees que la predicción sobre el mañana no es posible. Tampoco es necesario codificar categóricas en caliente, no necesariamente.
Sean Owen
No puedo ver por qué falla al capturar la "proximidad" de fechas cercanas. Si, por ejemplo, alimenta el vector binario a un NN, lo resolverá por sí solo después del entrenamiento adecuado. Usar vectores binarios es solo una forma de representar categorías.
Paco Barter
En este caso, efectivamente tiene columnas como "is_12th" y "is_13th" que, en el espacio de entrada, no están relacionadas y no están relacionadas con "is_1st", etc. Como característica continua, capturaría correctamente que el 12 y el 13 son en cierto sentido están más cerca que el 1 y el 12. Apela a lo que un modelo puede inferir, pero estoy hablando de lo que codifican las características de entrada.
Sean Owen
OK veo. Tienes razón, una característica continua captura mejor la calidad de "proximidad" de las fechas. Mi punto es que puede haber tendencias en los datos por lo que los valores numéricos de las fechas son irrelevantes (por ejemplo, un cierto patrón de compras de clientes solo los sábados). Por lo tanto, ofrece otro punto de vista para tratar con las fechas.
Paco Barter
Realmente, como dijo @PacoBarter, la codificación de uno en caliente ignora la diferente distancia entre categorías. Esto no es tan fácil de abordar ya que estas características son información de fase intrínseca, mientras que la mayoría de los modelos de aprendizaje automático no tienen entrada de tipo de fase. Sin embargo, algunos bricolaje en métricas de distancia podrían funcionar.
plpopk
0

Contexto de mi respuesta : Ha habido excelentes respuestas hasta ahora. Pero, quiero extender la conversación asumiendo que está hablando de una aplicación de aprendizaje automático para predecir los valores futuros de esta serie de tiempo en particular. Con ese contexto en mente, mi consejo está a continuación.

Consejo : Primero busque en las estrategias tradicionales de pronóstico estadístico (es decir, suavizado exponencial, SARIMAX o regresión dinámica) como base para el desempeño de la predicción. Aunque el aprendizaje automático ha demostrado ser muy prometedor para una variedad de aplicaciones, para series de tiempo, existen métodos estadísticos probados y verdaderos que pueden servirle mejor para su aplicación. Me gustaría llamar su atención sobre dos artículos recientes:

  1. Métodos de pronóstico estadístico y de aprendizaje automático: preocupaciones y caminos a seguir por Spyros Makridakis et al. El artículo señala que para muchas series temporales, el análisis estadístico tradicional de series temporales supera a los modelos de aprendizaje automático (ML). En esencia, ML tiene una tendencia a sobreajustar y se viola cualquier suposición de modelo de ML con respecto a entradas independientes.
  2. Pronósticos simples versus complejos: la evidencia de Kesten C Green et al. El artículo compara y examina el resultado de la serie temporal del análisis de series cronológicas de informes de artículos revisados ​​por pares con y sin comparaciones con una variedad de modelos. En conclusión, los investigadores complican demasiado su análisis con modelos que son más difíciles de interpretar y tienen un peor rendimiento. Comúnmente, esto ocurre debido a estructuras de incentivos deficientes.

Si está buscando un buen rendimiento, elija una métrica para compararla con varios modelos (es decir, como MASE) y explore varios modelos estadísticos (referencias a continuación) y de aprendizaje automático (con las estrategias de desarrollo de características mencionadas anteriormente).

Salud,

Recursos para el aprendizaje de pronósticos estadísticos : comenzaría por revisar el libro de texto gratuito de Rob J Hyndman aquí: https://otexts.org/fpp2/ . El texto se basa en un paquete R que puede incorporar fácilmente en su análisis: https://otexts.org/fpp2/appendix-using-r.html . Finalmente, tenga en cuenta la diferencia entre la validación cruzada de sección transversal y la validación cruzada de series de tiempo como se explica aquí: https://robjhyndman.com/hyndsight/tscv/ .

jranisau
fuente