Я использую нейронные сети для прогнозирования временных рядов. Вопрос, с которым я сейчас сталкиваюсь, заключается в том, как кодировать дату / время / серийный номер. каждого входа, установленного в качестве входа в нейронную сеть?
Должен ли я использовать кодирование 1 из C (используется для категорий кодирования), как описано здесь ?
Или я должен просто кормить это время (в миллисекундах с 1-1-1970)?
Или нет необходимости указывать время, пока я передаю остальные данные в хронологическом порядке?
Ответы:
Нейронные сети не волшебство. Если вы относитесь к ним так, как они есть, и просто бросаете в них данные, не думая, что у вас будет очень плохое время.
Вам нужно остановиться и спросить себя: "Будут ли миллисекунды с 1970 года на самом деле прогнозировать событие, которое меня интересует?" Ответ, к которому вы должны прийти немедленно, - нет. Почему? Для каждого случая, который вас действительно волнует (события в будущем, прошлое уже произошло), переменная времени примет значение, которое больше, чем любое значение, которое переменная времени примет в ваших тренировочных данных. Такая переменная вряд ли поможет. Что еще хуже, это может вызвать переоснащение (серьезная проблема для мощных нелинейных моделей, таких как нейронные сети), если вы не будете осторожны.
Теперь может иметь значение переменная, такая как неделя года или месяц, которая может помочь вам моделировать сезонные или годовые эффекты. Я проделал некоторую работу по прогнозированию болезней сельского хозяйства, где юлианский день оказался очень важной переменной. Основываясь на этом опыте, я подозреваю, что вам лучше было бы кодировать переменные этого типа как категориальные переменные, а не как порядковые, ваш опыт может быть очень большим. Обратите внимание, что месяц или неделя года являются повторяемыми событиями, которые, вероятно, будут неоднократно встречаться в ваших данных обучения, и можно объяснить, почему такая переменная может повлиять на финансовый результат. Сравните это с миллисекундами с 1970 года, что является монотонно возрастающим значением.
И, наконец, из вашего заявления: «Или вы тратите время не нужно, пока я передаю остальные данные в хронологическом порядке?» Похоже, вы не очень хорошо понимаете, как работают нейронные сети. При использовании стандартной нейронной сети с прямой связью порядок подачи данных в сеть не окажет влияния на прогнозы. Порядок может повлиять на обучение, если вы используете стохастический или мини-пакетный градиентный спуск, но это только артефакт итеративного (в отличие от пакетного) метода обучения. Если вы хотите смоделировать временную зависимость с помощью нейронной сети, вам нужно использовать что-то вроде скользящего окна или рекуррентной нейронной сети.
источник
Вы заявляете в комментариях, что работаете над прогнозированием финансовых временных рядов. включать ли время во входные данные или нет, зависит от предметной области. в целом это уместно, если в ваших данных есть какой-то «циклический» компонент времени. например, возможно, в ваших данных присутствует недельный эффект, если он работает в течение нескольких недель, или некоторый внутридневной эффект, если он охватывает один день. затем, если у вас много циклов, включите вход, который отражает позицию в цикле, например, из или или произнесите .[ 0 , 1 ] s i n ( t )[−1,1] [0,1] sin(t)
если вы обнаружите, что существует постоянная тенденция, например, увеличивающаяся или уменьшающаяся во времени, скажем, более целесообразно извлечь ее из входных данных до подачи входных данных через то, что называется « тренд-тренд ». другими словами, вы вычитаете формулу для этого основного тренда и прогнозируете тренд плюс разницу но NN фокусируется только на разности , а не на тренде .f ( t ) d t = f t + g t g t f tf(t) f(t) dt=ft+gt gt ft
источник