Construcción óptima de la característica del día en redes neuronales

19

Al trabajar en el problema de regresión, comencé a pensar en la representación de la función "día de la semana". Me pregunto qué enfoque funcionaría mejor:

  • una característica valor 1/7 para el lunes; 2/7 para el martes ...
  • 7 características: (1, 0, 0, 0, 0, 0, 0) para el lunes; (0, 1, 0, 0, 0, 0, 0) para el martes ...

Es difícil medirlo debido a las diferencias de configuración de la red. (Creo que seis características adicionales deberían reflejarse en la cantidad de nodos ocultos).

El número de todas las características es de aproximadamente 20. Utilizo backprop simple para aprender la red neuronal de retroalimentación normal.

Oepas Dost
fuente
¿Qué pasa con el uso de codificación binaria para el día de la semana? 3 características, donde (0, 0, 0) es el domingo. (0, 0, 1) para el lunes y así sucesivamente?
Shamoon
Esto tiene el beneficio adicional de reducir las características a algo más significativo para reducir en el tiempo de cálculo
Shamoon

Respuestas:

23

Su segunda representación es más tradicional para variables categóricas como el día de la semana.

Esto también se conoce como crear variables ficticias y es un método ampliamente utilizado para codificar variables categóricas. Si utilizó la codificación 1-7, le está diciendo al modelo que los días 4 y 5 son muy similares, mientras que los días 1 y 7 son muy diferentes. De hecho, los días 1 y 7 son tan similares como los días 4 y 5. La misma lógica es válida para la codificación 0-30 durante los días del mes.

El día del mes es un poco más complicado, porque si bien cada semana tiene los mismos 7 días, no todos los meses tienen los mismos 30 días: algunos meses tienen 31 días, y algunos meses tienen 28 días. Dado que tanto las semanas como los meses son cíclicos, podría usar transformaciones de Fourier para convertirlas en variables lineales suaves.

Por ejemplo ( usando R, mi lenguaje de programación de elección ):

day_of_month = c(1:31, 1:28, 1:30)
day_of_year <- 1:length(day_of_month)
s = sin((2*pi)/30*day_of_month)
c = cos((2*pi)/30*day_of_month)
plot(day_of_month ~ day_of_year)
lines(15*s+15 ~ day_of_year, col='blue')
lines(15*c+15 ~ day_of_year, col='red')
legend(10, 30, c('raw', 'sin', 'cos'), c('black', 'blue', 'red'))

crudo vs pecado vs coseno

(Escalé las variables seno / coseno para que sea 0/30, en lugar de -1/1 para que el gráfico se vea mejor)

Como puede ver, mientras que la "variable del día del mes" vuelve a cero al final de cada mes, las transformaciones seno y coseno hacen una transición suave que le permite al modelo saber que los días al final de un mes son similares a días a principios del próximo mes.

Puede agregar el resto de los términos de Fourier de la siguiente manera:

for(i in 1:3){
  s = sin((2*pi)/30*day_of_month + 30 * i/4)
  c = cos((2*pi)/30*day_of_month + 30 * i/4)
  lines(15*s+15 ~ day_of_year, col='blue')
  lines(15*c+15 ~ day_of_year, col='red')
}
legend(10, 30, c('raw', 'sin', 'cos'), c('black', 'blue', 'red'))

Transformaciones completas

Cada par de ondas seno / coseno forma un círculo:

m <- lapply(1:4, function(i){
  as.matrix(
    data.frame(
    s = sin((2*pi)/30*day_of_month + 30 * i/4),
    c = cos((2*pi)/30*day_of_month + 30 * i/4)
    )
  )
})
m <- do.call(cbind, m)
pairs(m)

circulo Esta página tiene una explicación muy útil de cómo manipular las ondas seno y coseno.

Zach
fuente
¿Hay alguna razón específica para hacerlo? Me pregunto cómo podría afectar la convergencia. Mi segunda duda es cuando una variable sigue siendo categórica: ¿qué pasa con el día del mes? (
0-30
La misma cosa; usar variables indicadoras. La primera codificación induce una medida de similitud que puede no ser apropiada; por ejemplo, ¿es el domingo el día más diferente del lunes? Eso es lo que implica la codificación ...
Emre
@OepasDost Si mi publicación responde a su pregunta, siéntase libre de votarla y / o aceptarla haciendo clic en la marca de verificación.
Zach
@Zach, ¿por qué consideraría el día de la semana (que se puede codificar de 0 a 6) como categórico y el día del mes como cíclico ordinal (y, por lo tanto, utiliza la transformación de Fourier). ¿Y no ambos como ordinales cíclicos y, por lo tanto, una transformación de Fourier también para el día de la semana?
zipp
1
@zipp También puedes usar un Fourier para el día de la semana. En mi experiencia, el valor principal del día de la semana es la diferencia entre días laborables y fines de semana, que es muy simple de capturar con variables ficticias (o una variable indicadora).
Zach