Sinir ağlarında gün özelliğinin en uygun şekilde oluşturulması


19

Regresyon problemi üzerinde çalışarak "haftanın günü" özelliğinin temsilini düşünmeye başladım. Hangi yaklaşımın daha iyi performans göstereceğini merak ediyorum:

  • bir özellik; Pazartesi için 1/7 değeri; Salı için 2/7 ...
  • 7 özellik: (1, 0, 0, 0, 0, 0, 0) Pazartesi için; (0, 1, 0, 0, 0, 0, 0) Salı günü ...

Ağ yapılandırma farklılıkları nedeniyle ölçmek zordur. (Ek altı özellik, inandığım gizli düğümlerin sayısına yansıtılmalıdır.)

Tüm özellik sayısı yaklaşık 20'dir. Sıradan ileri beslemeli sinir ağını öğrenmek için basit backprop kullanıyorum.


Haftanın günü için ikili kodlama kullanmaya ne dersiniz? (0, 0, 0) Pazar olan 3 özellik. (0, 0, 1) Pazartesi vb.
Shamoon

Bu, hesaplama zamanında özellikleri azaltmak için daha anlamlı bir şeye azaltma avantajına sahiptir
Shamoon

Yanıtlar:


23

İkinci sunumunuz haftanın günü gibi kategorik değişkenler için daha gelenekseldir.

Bu, sahte değişkenler oluşturma olarak da bilinir ve kategorik değişkenleri kodlamak için yaygın olarak kullanılan bir yöntemdir. 1-7 kodlaması kullandıysanız, modele 4. ve 5. günlerin çok benzer olduğunu, 1. ve 7. günlerin çok farklı olduğunu söylüyorsunuz. Aslında, 1. ve 7. günler 4. ve 5. günlerle aynıdır. Aynı mantık, ayın günleri için 0-30 kodlama için de geçerlidir.

Ayın günü biraz daha karmaşıktır, çünkü her hafta aynı 7 güne sahipken, her ay aynı 30 güne sahip değildir: bazı ayların 31 günü ve bazı ayların 28 günü vardır. Hem haftalar hem de aylar döngüsel olduğundan, onları düzgün doğrusal değişkenlere dönüştürmek için fourier dönüşümleri kullanabilirsiniz .

Örneğin ( R'yi kullanarak, tercih ettiğim programlama dili ):

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

çiğ vs sin vs kosinüs

(Sinüs / kosinüs değişkenlerini -1/1 yerine 0/30 olarak ölçeklendirdim, böylece grafik daha iyi görünüyor)

Gördüğünüz gibi, ham "ayın günü değişkeni" her ayın sonunda sıfıra geri dönerken, sinüs ve kosinüs dönüşümleri, modelin bir ayın sonundaki günlerin benzer olduğunu bildiren yumuşak bir geçiş yapar Bir sonraki ayın başında günler.

Fourier terimlerinin geri kalanını aşağıdaki gibi ekleyebilirsiniz:

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

Tam dönüşümler

Her sinüs / kosinüs dalgası çifti bir daire yapar:

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)

daire Bu sayfa sinüs ve kosinüs dalgalarının nasıl işleneceğine dair gerçekten kullanışlı bir açıklamaya sahiptir.


Bunun için belirli bir neden var mı? Acaba bu yakınsamayı nasıl etkileyebilir. İkinci şüphem, bir değişkenin hala kategorik olduğu zaman - ya ay günü? (0 - 30)
Oepas Dost

Aynı şey; gösterge değişkenlerini kullanır. İlk kodlama, uygun olmayabilecek bir benzerlik ölçüsü oluşturur; Örneğin, Pazar gerçekten Pazartesi gününden en farklı gün mü?
Emre

@OepasDost Mesajım sorunuzu yanıtlarsa, soruyu yükseltmek ve / veya onay işaretini tıklayarak kabul etmek için çekinmeyin.
Zach

@Zach neden haftanın gününü (0'dan 6'ya kodlanabilir) kategorik ve ayın gününü sıralı döngüsel olarak düşünün (ve bu nedenle Fourier dönüşümünü kullanın). Ve her ikisi de sıralı döngüsel değil ve bu nedenle Fourier dönüşümü haftanın günü için de değil mi?
zipp

1
@zipp Haftanın günü için bir Fourier kullanabilirsiniz. Deneyimlerime göre, haftanın gününün birincil değeri, kukla değişkenlerle (veya bir gösterge değişkeniyle) yakalanması çok basit olan hafta içi ve hafta sonu arasındaki farktır.
Zach
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.