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](https://miro.medium.com/v2/resize:fit:640/format:webp/1*vFheIa0ZgAJvfZ9SKLeFaQ.jpeg)
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
- Introducción e Implementación de Redes Siamesas
- Anunciando la vista previa de Amazon SageMaker Profiler Haga un seguimiento y visualice datos detallados de rendimiento de hardware para sus cargas de trabajo de entrenamiento de modelos.
- El algoritmo de Google hace que la encriptación FIDO sea segura contra ordenadores cuánticos
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!
Was this article helpful?
93 out of 132 found this helpful
Related articles
- El mito de la IA de ‘código abierto
- Un derrame le robó la capacidad de hablar a los 30 años. La IA está ayudando a restaurarla años después.
- RAG vs Finetuning ¿Cuál es la mejor herramienta para impulsar tu solicitud de LLM?
- ¿Podemos evitar que los LLMs alucinen?
- Explorando el paisaje de la inteligencia artificial generativa
- Agentes de IA Tendencia del Mes en IA Generativa
- Descubriendo el Teorema de Flujo Máximo Corte Mínimo Un Enfoque Integral y Formal