Как трудно это может быть?

LightGBM — это надежный алгоритм машинного обучения. Но умеет ли он считать до 10?

LightGBM, пожалуй, лучший алгоритм для табличных данных. Это умный метод, лежащий в основе многих решений-победителей в соревнованиях по машинному обучению. LightGBM также предоставляет данные временных рядов. Победитель последней итерации М соревнований по прогнозированию (M5) использовал LightGBM в качестве алгоритма обучения.

Поигравшись с ним, я решил использовать LightGBM для следующей задачи: предсказать следующее значение последовательности 1, 2, …, 9. То есть число 10. В этой задаче мало неопределенности, нужно просто суммировать 1 с предыдущим значением. Насколько это сложно для такого сложного алгоритма?

Вот код для моей первой попытки, которую я объясню ниже.

Мы начинаем с создания обучаемого набора данных, который мы называем sequence_df (строки 1–10). Вот как это выглядит:

Взяв в качестве примера первую строку, 4 — это целевое значение, а [1, 2, 3] — вектор независимых переменных. Итак, это следует авторегрессионной модели — использование прошлых наблюдений в качестве объясняющих переменных для текущего.

После создания набора данных мы подгоняем его к LightGBM (строки 11–18). Обычно следует оптимизировать гиперпараметры модели. Здесь я просто буду использовать конфигурацию по умолчанию для простоты.

Наконец, мы получаем предсказание для входного вектора [7, 8, 9].

И получаем 6,5.

Почему мы получаем 6,5? LightGBM построен с использованием древовидных методов. Они не могут экстраполироваться за пределы наблюдаемого (обученного) диапазона. Таким образом, LightGBM не может этого сделать. Значение 6,5 — это среднее значение целевой переменной обучения.

Мы можем решить эту проблему, введя этап предварительной обработки дифференциации, который удаляет тренд последовательности. «Как я описал в предыдущем посте, дифференциация — это процесс получения разница между последовательными наблюдениями временных рядов. Его цель - удалить тренд и стабилизировать среднее значение данных. Вот исправленный фрагмент:

Таким образом, этап разности в строке 8 преобразует последовательность [1, 2, …, 9] в постоянную последовательность единиц. Остальной процесс такой же, как и раньше, за исключением этапа прогнозирования.

Сначала мы получаем прогноз для различающихся данных (prediction_raw). Затем мы возвращаем операцию дифференцирования, добавляя последнее известное наблюдение, равное 9.

И вуаля, получаем 10.

Эта история представляет собой анекдот о поведении LightGBM, но это также и поучительная история. LightGBM — мощный алгоритм. Но предварительная обработка временных рядов имеет решающее значение для разработки систем прогнозирования. Так что следите за этой тенденцией!

Спасибо за прочтение!

P.S. Мы могли бы применить линейную модель (или бустер). Тогда разностный предварительный процесс не понадобится. Тем не менее, удаление тренда также может помочь линейным моделям при моделировании временных рядов.