Работая над проблемой регрессии, я начал думать о представлении функции «день недели». Интересно, какой подход будет работать лучше:
- одна особенность; значение 1/7 для понедельника; 2/7 для вторника ...
- 7 функций: (1, 0, 0, 0, 0, 0, 0) для понедельника; (0, 1, 0, 0, 0, 0, 0) для вторника ...
Это трудно измерить из-за различий в конфигурации сети. (Дополнительные шесть функций должны быть отражены в количестве скрытых узлов, я считаю.)
Количество всех функций около 20. Я использую простой backprop, чтобы изучить обычную прямую нейронную сеть.
Ответы:
Ваше второе представление более традиционно для категориальных переменных, таких как день недели.
Это также известно как создание фиктивных переменных и широко используется для кодирования категориальных переменных. Если вы использовали кодирование 1-7, вы говорите модели, что дни 4 и 5 очень похожи, а дни 1 и 7 очень разные. Фактически, дни 1 и 7 аналогичны дням 4 и 5. Та же логика действует для кодирования 0-30 для дней месяца.
День месяца немного сложнее, потому что, хотя каждая неделя имеет одинаковые 7 дней, не каждый месяц имеет одинаковые 30 дней: некоторые месяцы имеют 31 день, а некоторые месяцы имеют 28 дней. Поскольку и недели, и месяцы являются циклическими, вы можете использовать преобразования Фурье для преобразования их в гладкие линейные переменные.
Например ( используя R, мой язык программирования по выбору ):
(Я масштабировал переменные синус / косинус до 0/30, а не -1/1, чтобы график выглядел лучше)
Как вы можете видеть, хотя необработанная «переменная дня месяца» возвращается к нулю в конце каждого месяца, преобразования синуса и косинуса делают плавный переход, позволяющий модели знать, что дни в конце одного месяца похожи на дней в начале следующего месяца.
Вы можете добавить остальные термины Фурье следующим образом:
Каждая пара волн синус / косинус образует круг:
На этой странице есть очень удобное объяснение того, как управлять волнами синуса и косинуса.
источник