- Построение модели прогнозирования
- Случайный лес не может предсказать больше, чем t + 1, верно?
- Добавление временных переменных
- Масштабировать / нормализовать ваши данные
- Удаление трендов во входных переменных
- Добавить запаздывающие переменные
- Использование дельты в качестве цели
- Установление ориентира
- Проклятие размерности
- Стратегия тестирования на истории
- Переподготовка модели и прогнозирование
- Вывод
- Ссылки
Построение модели прогнозирования
В этом разделе я расскажу о некоторых действиях, которые, по моему мнению, были важными (и особенно уникальными) при построении модели прогнозирования с использованием древовидных методов.
Случайный лес не может предсказать больше, чем t + 1, верно?
Это действительно так — случайный лес нельзя использовать для прогнозирования более чем одного значения или неопределенного времени в будущем, как это можно сделать с помощью линейной модели. Это означает, что когда я пытаюсь предсказать 6 месяцев в будущем, мне нужно будет использовать данные за 6 месяцев в качестве входных данных.
Как пример, если моя модель способна прогнозировать 6 месяцев в будущем; для прогнозирования трафика на 1 июля 2019 года мне нужно будет использовать точки данных на 1 января 2019 года (для упрощения я предполагаю, что во всех месяцах 30 дней в месяце). Для прогнозирования на 2 июля 2019 года я буду использовать 2 января 2019 года. И так до 30 июня 2019 года, что дает мне прогноз на 30 декабря 2019 года.
Недостатком использования этого метода является невозможность использовать данные, которые ближе к настоящему (т.е. использовать данные 30 июня 2019 года для прогноза 1 июля 2019 года, как в приведенном выше примере). В нашем сценарии, поскольку нас действительно интересует объем трафика, который происходит через 6 месяцев, это все еще приемлемо.
Почему 6 месяцев? Потому что знание того, как будет развиваться трафик (к лучшему или к худшему), даст нам время внести необходимые изменения, чтобы попытаться изменить его. Более короткие сроки позволяют быстро принимать решения и выполнять их.
Однако, если ваш вариант использования требует действительно точного прогноза того, что произойдет завтра или на следующей неделе (например, торговля акциями), было бы лучше использовать данные из более позднего периода времени.
Добавление временных переменных
Мы вводим дополнительные переменные на основе даты, используя add_datepart метод из библиотеки fastai [9]. Это позволяет нам фиксировать тренды, сезонные или циклические особенности из нашего набора данных. Это довольно полезный метод, чтобы иметь в своем арсенале, особенно если нам приходится много работать с данными временных рядов.
def add_datepart(df, fldname, drop=True):
fld = df[fldname]
if not np.issubdtype(fld.dtype, np.datetime64):
df[fldname] = fld = pd.to_datetime(fld,
infer_datetime_format=True)
targ_pre = re.sub('[Dd]ate$', '', fldname)
for n in ('Year', 'Month', 'Week', 'Day', 'Dayofweek',
'Dayofyear', 'Is_month_end', 'Is_month_start',
'Is_quarter_end', 'Is_quarter_start', 'Is_year_end',
'Is_year_start'):
df[targ_pre+n] = getattr(fld.dt,n.lower())df[targ_pre+'Elapsed'] = fld.astype(np.int64) // 10**9
if drop: df.drop(fldname, axis=1, inplace=True)
Запуск метода дает нам следующие переменные.
- Месяц
- Год
- Неделя
- День
- День недели
- DayOfYear
- Is_month_end
- Is_month_start
- Is_quarter_end
- Is_quarter_start
- Is_year_end
- Is_year_start
- Прошедшее
Однако нам не обязательно использовать их все. Например, в моем случае использования мои данные основываются на еженедельной основе, поэтому у меня нет особой необходимости Day переменная.
Масштабировать / нормализовать ваши данные
Поскольку на диаграмме временных рядов тренды могут довольно сильно колебаться вверх и вниз, чтобы наш алгоритм мог лучше обобщать тестовые наборы, предпочтительно сначала нормализовать наши данные в некотором меньшем масштабе. Box Cox, Log или StandardScaler (и другие методы, конечно. Мой список ни в коем случае не является исчерпывающим) можно использовать для уточнения наших данных до более подходящего.
Просто не забудьте уменьшить их, как только вы сделали свой прогноз.
Удаление трендов во входных переменных
Обеспечение стационарности данных важно, поскольку это позволит нам обеспечить точный прогноз на будущее. Чтобы подчеркнуть, почему это проблема, рассмотрите следующую диаграмму.
Выше показано, как обычно можно разбить данные на наборы для обучения и проверки для задачи временного ряда. Обратите внимание, что из-за разделения обучающий набор не сможет захватить значения y набора проверки.
Случайные леса не очень хорошо подходят для увеличения или уменьшения тенденций, которые обычно встречаются при анализе временных рядов, таких как сезонность [10]
Чтобы исправить это, нам нужно в основном «сгладить» тренды, чтобы они стали «стационарными» Самый простой способ сделать это — использовать наклон данных или просто вычесть переменную во времяTэто время отстаётт-1,
Добавить запаздывающие переменные
Поскольку Random Forest оценивает точки данных без передачи информации из прошлого в настоящее (в отличие от линейных моделей или рекуррентной нейронной сети), определение запаздывающих переменных помогает выявить закономерности из прошлого, которые будут оцениваться в настоящем. Выбор, как далеко мы должны принять решение идти в значительной степени зависит от того, как цикличность самих подарков данных. В идеале, мы хотим, чтобы иметь возможность захвата по меньшей мере, один цикл данных.
Использование дельты в качестве цели
Как и в предыдущем пункте, мы делаем это (добавляем переменные запаздывания) даже к нашей целевой переменной, так как она основана на времени. Однако, так как мы не можем непосредственно получить данные по Т-1, мы используем вместо текущего трафика. Таким образом, формула для прогнозируемого трафика, как показано ниже.
Иногда это помогает записать формулу где-то, поскольку нам нужно будет применить ее до и после предсказания нашей модели.
Установление ориентира
Само собой разумеется, что наличие эталона для сравнения важно, чтобы у нас была точка отсчета для сравнения нашей модели. В моем случае, я пошел с 2-мя типами тестов; (Я) с использованием текущего трафика, и (II) с использованием 6 месяцев среднего трафика.
С точки зрения метрики измерения для модели, я выбрал RMSPE (среднеквадратичная ошибка в процентах), чтобы иметь возможность оценить ошибку от 0 до 100 (что также облегчает взаимодействие с заинтересованными сторонами).
Проклятие размерности
Этот момент не является уникальным для временных рядов. Но после создания нескольких сотен дополнительных переменных из запаздывающих данных наша модель может легко переопределиться из-за огромного количества переменных, которые мы вводим, в то же время все еще полагаясь только на ограниченное количество точек данных.
Чтобы решить эту проблему, я принял сознательное решение ограничить количество используемых переменных только верхним N, где N меньше, чем общее количество точек данных.
Стратегия тестирования на истории
Изначально я был только с использованием обычного расколу данных поезд-действительный-тест, чтобы проверить правильность моей модели. Однако, когда я углубился в предмет и приблизился к завершению, меня, наконец, осенило, что я никогда не смогу быть по-настоящему уверенным в производительности модели, если не подвергну ее строгому тестированию на основе времени.
Убер [11], как оказалось, имеет много хороших ссылок, когда речь идет о теме временных рядов.
В моем сценарии я применил метод расширяющегося окна — когда мои обучающие данные увеличивались на каждой итерации и сохраняли интервал окна тестирования / проверки одинаковым. Окно тестирования сохраняется один и то же, так что мы можем сравнить оба его производительность и стабильность во время.
В идеале, как также упоминалось в [11], мы должны поменять методологию тестирования с расширения окна на скольжение, как только размер наших данных станет достаточно большим.
Более подробно запись на эту тему также можно найти в [12].
Переподготовка модели и прогнозирование
Помимо сохранения данных перед тренировкой модели, это один из самых важных уроков, которые я извлек из этого упражнения.
Вы не можете просто развернуть статическую модель и оценить ее, концепция обслуживания модели не имеет смысла для прогнозирования временных рядов. Вместо этого вам нужно убедиться, что обучение и выбор модели могут быть выполнены на лету в процессе производства, и вы должны гарантировать, что весь ваш тренировочный набор может храниться и обрабатываться в процессе производства. [13]
Мое обычное понимание того, как можно внедрить модель ML, всегда заключалось в том, что модель обслуживалась в течение примерно 3–6 месяцев, прежде чем ее нужно было переобучить (если таковая имеется) и, возможно, отслеживать любые признаки снижения производительности за этот период.
Достаточно сказать, что переподготовка и прогнозирование на лету, как утверждается в [13], сначала застали меня врасплох. Однако, поскольку надежность модели временных рядов в значительной степени зависит от того, насколько свежими являются данные (т.е. представьте, что мы пытаемся прогнозировать трафик во времениT + 1; тогда лучшим предиктором будет трафик во временит),переквалифицироваться модель в каждый момент времени предсказания, то это не то, что нелепые мысли в конце концов.
Конечно, если структура исторических данных достаточно стабильна; возможно, переподготовка может быть запланирована с менее частым интервалом, или, возможно, только тогда, когда будет обнаружено событие точки изменения [15].
Вывод
Выше рецензия в основном основана от моих обучающих заметок, сделанных в течение моего времени, работая на этом прецеденте. Когда я впервые начал работать над этим, меня никогда не осенило, что я так многому научился — своего рода ожидал от анализа временных рядов, но не от построения моделей
Что меня весьма удивляет, так это то, как не так просто найти информацию по этому вопросу. Возможно, хотя, возможно, не так много ученых данных предпочитают строить свою модель прогнозирования, используя древовидные методы.
В конце концов, моя последняя модель не была случайным лесом. Я поменял его на модель, построенную с использованием LightGBM, для большей точности и дополнительного преимущества, связанного с возможностью генерировать интервалы прогнозирования для соответствия прогнозу (посредством квантильной регрессии). Тщательное рассмотрение должно быть взято, используя методы повышения градиента, хотя, поскольку довольно легко построить модель, которая соответствует данным. В моем случае документация на LightGBM [14] дала мне представление о том, как это преодолеть.
Наконец, отдельное спасибо товарищам по работе, которые были отличной прыгающей доской и помогли мне получить ясность по этому вопросу за такой короткий промежуток времени.
Обновление (04.03.2009): добавлен дополнительный разделСлучайный лес не может предсказать больше, чем t + 1, верно?а такжеМасштабировать / нормализовать ваши данныена основе отзывов читателей. (Спасибо, Хусейн.)
Ссылки
- Понимание вложений сущностей и их применения
- Случайные Лесные Регрессоры Теренсом Парром и Джереми Ховард
- Титаник: Начало работы с R Тревор Стивенс.(Честно говоря, я просто включил плагин для этого урока, так как это была ПЕРВАЯ статья, о которой я узнал еще в 2015 году, когда начинал в науке о данных. В настоящее время вы можете найти гораздо больше статей о деревьях решений / RF на Medium и т. Д., Но тогда — эта статья была одной из немногих в мире. Да, я впервые начал в R. И да — я сентиментален по этому поводу. Lol.)
- Пророк, Фейсбук
- Введение в векторную авторегрессию (VAR) МВФ
- Прогнозирование временных рядов с использованием рекуррентной нейронной сети и векторной авторегрессионной модели: когда и как Джеффри Лау
- Алгоритм прогнозирования DeepAR, AWS
- Остерегайтесь значения случайных лесов по умолчанию Теренсом Парром и Джереми Ховард
- Этот метод больше не доступен как часть последней библиотеки. Вы все еще можете найти в записной книжке Россман, хотя.
- Почему Random Forest не может предсказать тенденции и как преодолеть эту проблему?, по Аман Арора
- Прогнозирование в Uber: Введение Убер
- Временная серия Вложенная перекрестная проверка, по Кортни Кокрейн
- 3 факта о прогнозировании временных рядов, которые удивляют опытных практиков машинного обучения, по Скандер Ханначи, доктор философии
- Настройка параметров LightGBM
- Обнаружение изменений Википедия
Источник