Cómo codificar características de tiempo periódicas

Codificación de características temporales periódicas

Procesamiento cuidadoso de fechas, días de la semana y horas del día para el aprendizaje profundo y otros modelos de predicción.

Figura del autor

Muchas tareas de predicción requieren información de tiempo como entrada del modelo. Piense en un modelo de regresión para predecir las ventas de limonada de una empresa minorista (quizás recuerde el ejemplo de mi artículo sobre características enriquecidas de contexto). La demanda de bebidas refrescantes es obviamente mayor en verano, lo que resulta en una curva periódica de ventas con picos en julio/agosto (pensando en una ubicación en Europa aquí).

En este caso, el tiempo dentro del año es obviamente una información estacional valiosa que debemos alimentar en el modelo. Pero, ¿cómo deberíamos hacerlo? Las fechas son difíciles, el número de días cambia dependiendo del mes (y para febrero incluso dependiendo del año) y existen en varios formatos:

13 de enero de 2023

13.01.2023

2023/03/13

En primer lugar, podemos omitir el año. Para tener en cuenta un efecto estacional, solo necesitamos el día y el mes. En un enfoque muy simple (y no muy reflexivo), podríamos ingresar el mes como un número y el día como otro número.

¿Por qué es eso una mala idea? El modelo tendría que aprender cómo funciona el Calendario Gregoriano Cristiano (alrededor de 30 días por mes, 12 meses por año, años bisiestos, etc.). Con suficientes datos de entrenamiento, un modelo de aprendizaje profundo seguramente podrá “entender” nuestro calendario. “Entender” significa en este caso: el modelo puede inferir la posición temporal relativa dentro del año a partir de las entradas del mes y la fecha. Pero debemos facilitar el aprendizaje lo más posible para nuestro modelo y asumir esta tarea (al menos ya sabemos cómo funciona el calendario). Utilizamos la biblioteca datetime de Python y calculamos el tiempo relativo dentro del año con una lógica bastante simple: import datetime as

from datetime import datetimeimport calendaryear = 2023month = 12day = 30passed_days = (datetime(year, month, day) - datetime(year, 1, 1)).days + 1nr_of_days_per_year= 366 if calendar.isleap(year) else 365position_within_year = passed_days / nr_of_days_per_year

La característica resultante position_within_year con un rango de valores cercano a 0.0 (1 de enero) a 1.0 (31 de diciembre) es mucho más fácil de interpretar por el modelo que el (malditamente complicado) Calendario Gregoriano.

Pero aún no es ideal. La característica position_within_year describe un patrón “diente de sierra” con un salto abrupto de 1.0 a 0.0 en cada cambio de año. Esta discontinuidad brusca puede ser un problema para el aprendizaje efectivo. El 31 de diciembre y el 1 de enero son fechas muy similares: son vecinos directos y tienen mucho en común (por ejemplo, condiciones climáticas similares) y probablemente tengan un potencial similar para las ventas de limonada. Sin embargo, la característica position_within_year no refleja esta similitud para el 31 de diciembre y el 1 de enero; de hecho, son tan diferentes como pueden serlo.

Idealmente, los puntos en el tiempo cercanos entre sí deberían tener valores de tiempo similares. De alguna manera, tenemos que diseñar una característica que represente la naturaleza cíclica del año. En otras palabras, para el 31 de diciembre deberíamos llegar a la posición donde comenzamos el 1 de enero. Entonces, por supuesto, tiene sentido modelar la posición dentro del año como la posición en un círculo. Podemos hacer esto transformando position_within_year en las coordenadas x e y de un círculo unitario.

Para esto, utilizamos las funciones seno y coseno:

sin(α) = x

cos(α) = y

donde α es el ángulo aplicado al círculo. Si el círculo unitario representa el año, α representa el tiempo dentro del año que ya ha pasado.

α es equivalente a la característica posición_dentro_del_año, la única diferencia es que α tiene una escala diferente (α: 0,0–2π¹, posición_dentro_del_año: 0,0-1,0).

Al escalar simplemente la posición_dentro_del_año a α y calcular el seno y el coseno, transformamos el patrón de “dientes de sierra” a una representación circular con transiciones suaves.

import math# escalar a 2pi (360 grados)alpha = posición_dentro_del_año * math.pi * 2círculo_año_x = math.sin(alpha)círculo_año_y = math.cos(alpha)# escalar entre 0 y 1 (las posiciones originales del círculo unitario están entre -1 y 1)círculo_año_x = (círculo_año_x + 1) / 2círculo_año_y = (círculo_año_y + 1) / 2característica_tiempo = (círculo_año_x, círculo_año_y) # ¡qué hermoso! ;)

La característica_tiempo resultante es un vector de dos elementos escalado entre 0 y 1 que es fácil de comprender para su modelo de predicción. Con unas pocas líneas de código, quitamos mucha carga innecesaria de aprendizaje de los hombros de nuestro modelo.

El modelo del círculo unitario se puede aplicar a cualquier información de tiempo periódica, como día del mes, día de la semana, hora del día, minuto de la hora, etc. El concepto también se puede ampliar a características cíclicas fuera del dominio del tiempo:

  • Logística/Transporte Público: Posición relativa de un autobús en su recorrido por la ciudad

  • Biología: Estado de una célula dentro del ciclo celular.
  • ¿Tienes otros casos de uso en mente? ¡Eres bienvenido/a a escribir un comentario!

Información Adicional / Puntos de Conexión

  • Un excelente artículo práctico sobre el mismo tema de Pierre-Luis Bescond.
  • ¿Quieres aprender más sobre la ingeniería de características para modelos de aprendizaje profundo? Lee mi artículo sobre datos enriquecidos de contexto.
  • ¿Tienes preguntas? ¿Necesitas un experto freelance en IA, Ciencia de Datos, Ingeniería de Datos o Desarrollo en Python? Visita mi sitio web y escríbeme un mensaje.

[1] El ángulo se da en radianes aquí. 0 en radianes corresponde a 0°, 2π en radianes corresponde a 360°.

Todas las figuras fueron creadas por el autor.

We will continue to update Zepes; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

Inteligencia Artificial

Un Enfoque Más Suave hacia la Robótica

Los robots flexibles están pasando del laboratorio de investigación al mundo real.

Aprendizaje Automático

¡Hola GPU, ¿qué hay de mi matriz?

Multiplicación de matrices; el Santo Grial de las redes neuronales profundas y los gigantes modernos de la comprensió...

Inteligencia Artificial

Calidad desigual de los parques expuesta a través de las redes sociales y el aprendizaje automático

El estudio utiliza las redes sociales y el aprendizaje automático para mostrar las injusticias ambientales en los par...

Inteligencia Artificial

Este boletín de IA es todo lo que necesitas #65

Esta semana en IA, tuvimos avances en la regulación de la IA desde el Capitolio líderes tecnológicos como Elon Musk y...

Inteligencia Artificial

Preocupaciones sobre la privacidad en torno a los LLM como ChatGPT este artículo de IA revela posibles riesgos y medidas de protección

Mientras ChatGPT rompe récords, surgen algunas preguntas sobre la seguridad de la información personal utilizada en e...

Inteligencia Artificial

La retroalimentación colaborativa ayuda a entrenar a los robots

Un enfoque de aprendizaje por refuerzo entrena a los robots utilizando retroalimentación proporcionada por usuarios n...