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

Mejorando la Sumarización de GPT-4 a través de una Cadena de Indicaciones de Densidad

Los Modelos de Lenguaje Grandes han ganado mucha atención en los últimos tiempos debido a sus excelentes capacidades....

Inteligencia Artificial

Empresa derivada de la Universidad de Glasgow recauda $43 millones para 'Digitalizar la Química

Chemify, que se separó de la Universidad de Glasgow del Reino Unido en 2022, ha recibido $43 millones de financiamien...

Inteligencia Artificial

Aterrizaje de Chandrayaan 3 Cómo la IA y los sensores ayudaron en la épica empresa lunar de la ISRO.

En la fascinante expansión de la exploración espacial, cada misión es una apuesta cósmica, cada una un lanzamiento de...

Inteligencia Artificial

Conoce DenseDiffusion una técnica de IA sin entrenamiento para abordar subtítulos densos y manipulación de diseño en la generación de texto a imagen

Los avances recientes en los modelos de texto a imagen han llevado a sistemas sofisticados capaces de generar imágene...

Inteligencia Artificial

Comenzando con la IA

Aquí estoy asumiendo que has leído mi artículo anterior sobre Cómo aprender IA. Como recordatorio, recomiendo encarec...

Inteligencia Artificial

Investigadores de UC Berkeley introducen Ghostbuster un método de IA SOTA para detectar texto generado por LLM

ChatGPT ha revolucionado la capacidad de producir fácilmente una amplia gama de texto fluido sobre una amplia gama de...