Construção ideal do recurso do dia em redes neurais

18

Trabalhando no problema de regressão, comecei a pensar na representação do recurso "dia da semana". Gostaria de saber qual abordagem teria melhor desempenho:

  • uma característica; valor 1/7 para segunda-feira; 2/7 para terça-feira ...
  • 7 recursos: (1, 0, 0, 0, 0, 0, 0) para segunda-feira; (0, 1, 0, 0, 0, 0, 0) para terça-feira ...

É difícil mensurá-lo devido a diferenças na configuração da rede. (Seis recursos adicionais devem ser refletidos no número de nós ocultos, acredito).

O número de todos os recursos é de cerca de 20. Uso backprop simples para aprender uma rede neural de feed-forward comum.

Oepas Dost
fonte
Que tal usar codificação binária para o dia da semana? 3 recursos, onde (0, 0, 0) é domingo. (0, 0, 1) para segunda-feira e assim por diante?
Shamoon 03/03
Isto tem o benefício adicional de reduzir os recursos para algo mais significativo para reduzir em tempo de computação
Shamoon

Respostas:

22

Sua segunda representação é mais tradicional para variáveis ​​categóricas como dia da semana.

Isso também é conhecido como criar variáveis ​​fictícias e é um método amplamente usado para codificar variáveis ​​categóricas. Se você usou a codificação 1-7, está dizendo ao modelo que os dias 4 e 5 são muito semelhantes, enquanto os dias 1 e 7 são muito diferentes. De fato, os dias 1 e 7 são tão parecidos quanto os dias 4 e 5. A mesma lógica vale para codificação de 0 a 30 nos dias do mês.

O dia do mês é um pouco mais complicado, porque enquanto toda semana tem os mesmos 7 dias, nem todo mês tem os mesmos 30 dias: alguns meses têm 31 dias e outros têm 28 dias. Como as semanas e os meses são cíclicos, você pode usar transformações de quatro camadas para convertê-las em variáveis ​​lineares suaves.

Por exemplo ( usando R, minha linguagem de programação preferida ):

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'))

bruto vs pecado vs cosseno

(Dimensionei as variáveis ​​seno / cosseno para 0/30, em vez de -1/1, para que o gráfico pareça melhor)

Como você pode ver, enquanto a "variável dia do mês" bruta volta a zero no final de cada mês, as transformações seno e cosseno fazem uma transição suave que permite ao modelo saber que os dias no final de um mês são semelhantes a dias no início do próximo mês.

Você pode adicionar o restante dos termos de quatro camadas da seguinte maneira:

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'))

Transformações completas

Cada par de ondas seno / cosseno forma um 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)

círculo Esta página tem uma explicação realmente útil de como manipular ondas seno e cosseno.

Zach
fonte
Existe algum motivo específico para fazer isso? Eu me pergunto como isso poderia afetar a convergência. Minha segunda dúvida é quando uma variável ainda é categórica - e o dia do mês? (0 - 30)
Oepas Dost 02/12/14
Mesma coisa; use variáveis ​​indicadoras. A primeira codificação induz uma medida de similaridade que pode não ser apropriada; por exemplo, domingo é realmente o dia mais diferente da segunda-feira? Isso é o que a codificação implica ...
Emre
@OepasDost Se minha postagem responder à sua pergunta, faça um voto positivo e / ou aceite clicando na marca de seleção.
Zach
@Zach Por que você considera o dia da semana (que pode ser codificado de 0 a 6) como categórico e o dia do mês como cíclico ordinal (e, portanto, usa a transformação de Fourier). E não os dois como cíclicos ordinais e, portanto, um Fourier se transforma no dia da semana também?
Zipp
1
@ zip Você também pode usar um Fourier para o dia da semana. Na minha experiência, o valor principal do dia da semana é a diferença entre dias da semana e fins de semana, o que é muito simples de capturar com variáveis ​​fictícias (ou uma variável indicadora).
Zach