Оптимальна побудова особливості дня в нейронних мережах


19

Працюючи над проблемою регресії, я почав думати про представлення функції "день тижня". Цікаво, який підхід би краще:

  • одна особливість; значення 1/7 за понеділок; 2/7 на вівторок ...
  • 7 особливостей: (1, 0, 0, 0, 0, 0, 0) для понеділка; (0, 1, 0, 0, 0, 0, 0) за вівторок ...

Важко це виміряти через різниці в конфігурації мережі. (Додаткові шість функцій повинні відображатися в кількості прихованих вузлів, які я вважаю.)

Кількість усіх функцій становить приблизно 20. Я використовую просту підтримку, щоб вивчити звичайну нейронну мережу передачі вперед.


А як щодо використання двійкового кодування для дня тижня? 3 функції, де (0, 0, 0) - неділя. (0, 0, 1) на понеділок тощо?
Шамун

Це має додаткову перевагу - зменшення функцій до чогось більш значущого скорочення часу на обчислення
Shamoon

Відповіді:


23

Ваше друге представлення є більш традиційним для категоричних змінних, таких як день тижня.

Це також відоме як створення фіктивних змінних і широко використовується метод кодування категоричних змінних. Якщо ви використовували кодування 1-7, ви повідомляєте моделі, що 4 і 5 дні дуже схожі, тоді як дні 1 і 7 дуже відрізняються. Насправді дні 1 та 7 настільки ж схожі, як 4 та 5. День цієї ж логіки дотримується кодування 0-30 для днів місяця.

День місяця трохи складніший, оскільки хоча кожен тиждень має однакові 7 днів, не кожен місяць має однакові 30 днів: деякі місяці мають 31 день, а деякі місяці мають 28 днів. Оскільки і тиждень, і місяці мають циклічний характер, ви можете використовувати перетворення Фур'є для перетворення їх на гладкі лінійні змінні.

Наприклад ( використовуючи R, мою мову програмування на вибір ):

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

сирий проти гріха проти косинуса

(Я масштабував змінні синуси / косинуси до 0/30, а не -1/1, так що графік виглядає краще)

Як бачимо, в той час як сира "зміна дня місяця" стрибає назад до нуля в кінці кожного місяця, перетворення синуса і косинуса роблять плавний перехід, завдяки якому модель може знати, що дні наприкінці місяця схожі на днів на початку наступного місяця.

Ви можете додати решту термінів фур'є таким чином:

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

Повні перетворення

Кожна пара синусоїдних і косинусних хвиль робить коло:

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)

коло На цій сторінці є дуже зручне пояснення, як маніпулювати хвилями синуса та косинуса.


Чи є якась конкретна причина для цього? Цікаво, як це могло вплинути на конвергенцію. Моє друге сумнів - коли змінна все ще є категоричною - як щодо дня місяця? (0 - 30)
Oepas Dost

Однакові речі; використовувати змінні індикатора. Перше кодування викликає міру подібності, яка може бути невідповідною; наприклад, чи дійсно неділя є самим різним днем ​​від понеділка? Ось що має на увазі кодування ...
Емре

@OepasDost Якщо моя публікація відповідає на ваше запитання, не соромтесь голосувати за неї та / або приймати її, натиснувши прапорець.
Зак

@Zach, чому б ви вважали день тижня (який може бути закодований від 0 до 6) як категоричний, а день місяця як порядковий циклічний (і тому використовувати перетворення Фур'є). І не обидва вони є порядковими циклічними, і тому перетворення Фур'є також день тижня?
zipp

1
@zipp Ви можете використовувати Фур'є і для дня тижня. На мій досвід, основне значення дня тижня - це різниця між будними днями та вихідними днями, що дуже просто зафіксувати за допомогою фіктивних змінних (або змінної індикатора).
Зак
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.