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

Обзор данных

Сначала я создаю данные временного ряда с суперпозицией смещения, тренда, сезонности и некоторого шума. Сложив их, мы получаем наши искусственно сгенерированные данные. Сначала предположим, что по оси абсцисс каждый интервал равен 1 дню.

Древо решений

Во-первых, я разделил данные за последние 4 года как набор для проверки. Затем я подобрал обучающий набор с помощью RandomForestRegressor. RandomForestRegressor необходим просто как ансамбль DecisionTree. Его можно обучить очень быстро, как и вы, и использовать многопоточность для обучения разных деревьев и выполнения простого среднего.

from sklearn.ensemble import RandomForestRegressor
from sklearn.tree import DecisionTreeRegressor
m1 = RandomForestRegressor(n_estimators=100,max_depth=20)
m1.fit(x_train,y_train)

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

Позвольте нырнуть глубже в одно из деревьев. На этот раз я поместил одно дерево с DecisionTreeRegressor с max_depth = 3, чтобы визуализировать его эффективно.

tree = DecisionTreeRegressor(max_depth=3)
tree.fit(x_train,y_train)

Где «Регрессор»? В этом дереве нет «регрессии». Фактически, он объединяет множественные классификаторы и берет средние значения отдельных групп. В этом случае единственная функция, которая у нас была, - это «Дата». Следовательно, в предыдущем примере, когда мы пытаемся предсказать с помощью набора проверки, мы получаем прямую линию, потому что это природа того, как работает дерево. Самое близкое, что он может сделать, - это снова и снова предсказывать одно и то же значение. Деревья хороши для интерполяции, но не для экстраполяции. У него нет такой возможности, как линейная регрессия или нейронная сеть, которые позволяют расширять прогноз до бесконечности, он может только предсказывать то, что уже видел.

Разработка функций

Означает ли это, что деревья не могут делать прогнозы для временных рядов? Не обязательно. Я добавил больше функций в набор данных, добавив функции даты. Вы можете принять 1 = 2012–01–01 и так далее.

Давайте снова применим ту же модель к этим данным, рассчитанным на основе функций. Он по-прежнему хорошо справляется с подгонкой данных. На этот раз дерево гораздо лучше справляется с предсказанием. Он показывает сезонность и разумный прогноз на первый год.

Опять же, я использую то же DecisionTree с max_depth = 3, чтобы получить некоторую интуицию. Наблюдая за первым разделением, он разделил данные с DayofYear ≤185,5. Он узнает сезонность, выплевывая год на половину.

В заключение скажу, что Деревья, естественно, не обладают способностью работать с временными рядами. Он не может выполнять экстраполяцию, поскольку является классификатором. Мы показываем, что, разделив компонент времени на большее количество функций, он может начать изучать сезонность, но все же будет страдать от проблемы экстраполяции.

✉️ Подпишитесь на рассылку еженедельно Email Blast 🐦 Подпишитесь на CodeBurst на Twitter , просмотрите 🗺️ План развития веб-разработчиков на 2018 год и 🕸️ Изучите веб-разработку с полным стеком .