Optymalna konstrukcja funkcji dnia w sieciach neuronowych

19

Pracując nad problemem regresji, zacząłem myśleć o przedstawieniu funkcji „dzień tygodnia”. Zastanawiam się, które podejście działałoby lepiej:

  • jedna cecha; wartość 1/7 dla poniedziałku; 2/7 na wtorek ...
  • 7 funkcji: (1, 0, 0, 0, 0, 0, 0) na poniedziałek; (0, 1, 0, 0, 0, 0, 0) na wtorek ...

Trudno to zmierzyć z powodu różnic w konfiguracji sieci. (Wierzę, że dodatkowe sześć funkcji powinno znaleźć odzwierciedlenie w liczbie ukrytych węzłów).

Liczba wszystkich funkcji wynosi około 20. Korzystam z prostego backpropu, aby nauczyć się zwykłej sieci neuronowej z przekazywaniem danych.

Oepas Dost
źródło
Co powiesz na użycie kodowania binarnego na dzień tygodnia? 3 funkcje, gdzie (0, 0, 0) to niedziela. (0, 0, 1) na poniedziałek i tak dalej?
Shamoon,
Ma to tę dodatkową zaletę, że redukuje funkcje do czegoś bardziej znaczącego, aby skrócić czas obliczeń
Shamoon

Odpowiedzi:

23

Druga reprezentacja jest bardziej tradycyjna dla zmiennych jakościowych, takich jak dzień tygodnia.

Jest to również znane jako tworzenie zmiennych zastępczych i jest szeroko stosowaną metodą kodowania zmiennych kategorialnych. Jeśli użyłeś kodowania 1-7, mówisz modelowi, że dni 4 i 5 są bardzo podobne, podczas gdy dni 1 i 7 są bardzo odmienne. W rzeczywistości dni 1 i 7 są tak samo podobne jak dni 4 i 5. Ta sama logika obowiązuje dla kodowania 0-30 dla dni miesiąca.

Dzień miesiąca jest nieco trudniejszy, ponieważ chociaż każdy tydzień ma te same 7 dni, nie każdy miesiąc ma te same 30 dni: niektóre miesiące mają 31 dni, a niektóre miesiące 28. Ponieważ zarówno tygodnie, jak i miesiące są cykliczne, można użyć transformacji Fouriera do przekształcenia ich w gładkie zmienne liniowe.

Na przykład ( używając R, mojego wybranego języka programowania ):

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

raw vs sin vs cosinus

(Przeskalowałem zmienne sinus / cosinus do 0/30, zamiast -1/1, więc wykres wygląda lepiej)

Jak widać, podczas gdy surowa „zmienna dnia miesiąca” przeskakuje z powrotem na zero na koniec każdego miesiąca, transformacje sinus i cosinus tworzą płynne przejście, które pozwala modelowi wiedzieć, że dni na koniec jednego miesiąca są podobne do dni na początku następnego miesiąca.

Możesz dodać resztę czterech terminów w następujący sposób:

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

Zakończ transformacje

Każda para fal sinusoidalnych / cosinusowych tworzy koło:

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)

okrąg Ta strona zawiera naprawdę przydatne wyjaśnienie, jak manipulować falami sinusoidalnymi i cosinusowymi.

Zach
źródło
Czy istnieje jakiś konkretny powód? Zastanawiam się, jak to może wpłynąć na konwergencję. Moje drugie wątpliwości dotyczą tego, kiedy zmienna jest nadal kategoryczna - a co z dniem miesiąca? (0 - 30)
Oepas Dost
Ta sama rzecz; użyj zmiennych wskaźnikowych. Pierwsze kodowanie wywołuje miarę podobieństwa, która może nie być odpowiednia; np. czy niedziela jest naprawdę najbardziej odmiennym dniem od poniedziałku? Właśnie to oznacza kodowanie ...
Emre
@OepasDost Jeśli mój post odpowiada na twoje pytanie, możesz głosować nad nim i / lub zaakceptować, klikając znacznik wyboru.
Zach.
@Zach dlaczego miałbyś uważać dzień tygodnia (który można zakodować od 0 do 6) za kategoryczny, a dzień miesiąca za porządek cykliczny (i dlatego używać transformacji Fouriera). I nie oba z nich są porządkami cyklicznymi, a zatem czy transformacja Fouriera również obowiązuje w dzień tygodnia?
zipp
1
@zipp Możesz również użyć Fouriera na dzień tygodnia. Z mojego doświadczenia wynika, że ​​podstawową wartością dnia tygodnia jest różnica między dniami powszednimi a weekendami, którą można bardzo łatwo uchwycić za pomocą zmiennych fikcyjnych (lub zmiennej wskaźnikowej).
Zach