Konstruksi optimal fitur hari di jaringan saraf

18

Mengatasi masalah regresi, saya mulai memikirkan representasi fitur "hari dalam seminggu". Saya ingin tahu pendekatan mana yang lebih baik:

  • satu fitur; nilai 1/7 untuk hari Senin; 2/7 untuk hari Selasa ...
  • 7 fitur: (1, 0, 0, 0, 0, 0, 0) untuk hari Senin; (0, 1, 0, 0, 0, 0, 0) untuk hari Selasa ...

Sulit untuk mengukurnya karena perbedaan konfigurasi jaringan. (Enam fitur tambahan harus tercermin dalam jumlah node tersembunyi yang saya percaya.)

Jumlah semua fitur adalah sekitar 20. Saya menggunakan backprop sederhana untuk mempelajari jaringan saraf umpan-maju biasa.

Oepas Dost
sumber
Bagaimana dengan menggunakan pengkodean biner untuk hari dalam seminggu? 3 fitur, di mana (0, 0, 0) adalah hari Minggu. (0, 0, 1) untuk hari Senin dan seterusnya?
Shamoon
Ini memiliki manfaat tambahan untuk mengurangi fitur menjadi sesuatu yang lebih berarti untuk dikurangi dalam waktu perhitungan
Shamoon

Jawaban:

22

Representasi kedua Anda lebih tradisional untuk variabel kategori seperti hari dalam seminggu.

Ini juga dikenal sebagai membuat variabel dummy dan merupakan metode yang banyak digunakan untuk pengkodean variabel kategori. Jika Anda menggunakan 1-7 penyandian, Anda memberi tahu model bahwa hari 4 dan 5 sangat mirip, sedangkan hari 1 dan 7 sangat berbeda. Bahkan, hari 1 dan 7 sama seperti hari 4 dan 5. Logika yang sama berlaku untuk 0-30 penyandian untuk hari dalam sebulan.

Hari dalam sebulan sedikit lebih sulit, karena sementara setiap minggu memiliki 7 hari yang sama, tidak setiap bulan memiliki 30 hari yang sama: beberapa bulan memiliki 31 hari, dan beberapa bulan memiliki 28 hari. Karena minggu dan bulan bersifat siklis, Anda dapat menggunakan transformasi fourier untuk mengubahnya menjadi variabel linier yang lancar.

Misalnya ( menggunakan R, bahasa pemrograman pilihan saya ):

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

mentah vs dosa vs cosinus

(Saya menskala variabel sinus / kosinus menjadi 0/30, daripada -1/1 sehingga grafik terlihat lebih baik)

Seperti yang Anda lihat, sementara "hari dalam variabel bulan" mentah melompat kembali ke nol pada akhir setiap bulan, transformasi sinus dan kosinus membuat transisi yang mulus yang memungkinkan model mengetahui hari-hari pada akhir satu bulan sama dengan hari pada awal bulan berikutnya.

Anda dapat menambahkan sisa istilah fourier sebagai berikut:

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

Transformasi lengkap

Setiap pasang gelombang sinus / kosinus membuat lingkaran:

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)

lingkaran Halaman ini memiliki penjelasan yang sangat berguna tentang bagaimana memanipulasi gelombang sinus dan kosinus.

Zach
sumber
Apakah ada alasan khusus untuk melakukannya? Saya bertanya-tanya bagaimana ini dapat memengaruhi konvergensi. Keraguan kedua saya adalah ketika variabel masih kategorikal - bagaimana dengan hari bulan? (0 - 30)
Oepas Dost
Hal yang sama; gunakan variabel indikator. Pengkodean pertama menginduksi ukuran kesamaan yang mungkin tidak sesuai; misalnya, apakah hari Minggu benar-benar hari yang paling berbeda dari hari Senin? Itulah yang menyiratkan pengkodean ...
Emre
@OepasDost Jika posting saya menjawab pertanyaan Anda, silakan pilih dan / atau terima dengan mengklik tanda centang.
Zach
@Zach mengapa Anda menganggap hari dalam seminggu (yang dapat dikodekan dari 0 hingga 6) sebagai kategorikal dan hari dalam sebulan sebagai siklus ordinal (dan karenanya menggunakan transformasi Fourier). Dan tidak keduanya sebagai siklus ordinal dan karena itu melakukan transformasi Fourier untuk hari minggu juga?
zipp
1
@zipp Anda juga bisa menggunakan Fourier untuk hari dalam seminggu. Dalam pengalaman saya, nilai utama hari dalam seminggu adalah perbedaan antara hari kerja dan akhir pekan, yang sangat mudah ditangkap dengan variabel dummy (atau variabel indikator).
Zach