Препятствия, с которыми я столкнулся при прогнозировании данных многомерных временных рядов, и способы их преодоления

Были ли у вас временные ряды с многомерными столбцами, временные ряды, в которых ваши столбцы не находятся в одном диапазоне размеров или даже в одном и том же типе данных, что приводило к невозможности применения моделей ARIMA, SARIMAX или Auto ARIMA?

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

Первое, что я попробовал, - это использовать только температуру в помещении для прогнозирования будущей температуры в помещении с помощью ARIMA. Моя модель предсказывала одно и то же значение температуры для всех будущих минут. Я также разделил свои данные на пятиминутные снимки температуры в помещении для прогнозирования. Это тоже было не очень многообещающе. Из исследовательского анализа данных я подтвердил, что существует взаимосвязь между температурой в помещении, температурой наружного воздуха и информацией о состоянии бинарного котла. Я не мог просто игнорировать эти две другие колонки и продолжать моделировать только при комнатной температуре.

По результатам, полученным выше, я решил вернуться к чертежной доске. Я хотел спрогнозировать внутреннюю температуру здания, используя внутреннюю температуру, наружную температуру и информацию о состоянии бинарного котла. Одним из решений этой проблемы является использование sktime, библиотеки scikit-learn для прогнозирования, классификации и регрессии временных рядов. В то время я еще не научился использовать sktime, поэтому решил использовать все, что было в моем наборе инструментов для анализа данных.

Ниже я расскажу обо всех шагах, которые я прошел, прежде чем придумал работающую модель. Перед процессом моделирования я очистил свои данные, проверил их на стационарность, применил тест Дики-Фуллера и подтвердил, что мои данные являются стационарными для моделирования и отсутствуют сезонность или тенденции.

Я решил установить определенные границы для ранее поставленной цели. Ниже вы можете увидеть мою обновленную цель:

Прогнозируйте внутреннюю температуру здания на пять минут вперед, используя пятиминутные снимки внутренней температуры, наружной температуры и двоичной информации о состоянии котла.

1. Создание переменных-предикторов

Я решил использовать все три своих столбца в качестве предикторов. Чтобы создать предикторы на пять минут, я использовал метод pandas .shift.

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

2. Создание целевой переменной

Моей целевой переменной была температура в помещении на следующей пятой минуте. Чтобы создать это, я использовал метод .shift для сдвига данных на пять минут с периодами = -5.

3. Тренировка тестового сплита

Из-за количества периодов сдвига существует вероятность, что данные прогнозирования и целевые данные не будут иметь одинаковую длину. Всегда рекомендуется проверять длину наборов данных. Если длины не совпадают, проверьте даты начала и окончания.

Через метод train_test_split

Функция train_test_split Scikit-learn разделит данные случайным образом. В моем случае я создал фрейм данных с предикторами за пять минут. Поскольку это мои единственные предсказатели, меня не волновал порядок индекса.

X = ts.copy()
y = target.copy()

X_train, X_test, y_train, y_test = train_test_split(X, y,  test_size=.25, random_state=123)

Через нарезку с помощью .iloc

Если вы используете нарезку с .iloc, это разделит ваш набор данных с порядком. Это определит первые 75% данных как ваш обучающий набор и последние 25% как ваши тестовые данные.

train_size = 0.75
split_idx = round(len(ts)* train_size)
# Split predictors
X_train = ts.iloc[:split_idx]
X_test = ts.iloc[split_idx:]
# Split target
y_train = target.iloc[:split_idx]
y_test = target.iloc[split_idx:]

4. Моделирование

Я создал свою базовую модель (я выбрал регрессионную модель LassoLarsCV) и применил различные регрессионные модели, в основном методы ансамбля. Каждый раз, когда я получал лучший результат с новой регрессионной моделью, я менял свое лучшее модельное предположение.

Для подробного регрессионного моделирования вы можете обратиться к моей статье Пошаговое руководство по регрессионному моделированию. Чего ожидать от этой статьи:

  • Предварительная обработка данных (быстрое кодирование, стандартизация данных, преобразование столбцов, устранение рекурсивных функций)
  • Создание экземпляра алгоритма регрессии
  • Создание GridSearchCV
  • Применение конвейера
  • Подгонка модели
  • Проверка модели с помощью оценки R2 и MSE
  • Нанесение на график важности признаков (для методов дерева и ансамбля)
  • Идеи настройки модели

Попробовав несколько методов, я выбрал модель с лучшими показателями R2 и MSE и работал над настройкой модели.

5. Настройка модели

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

Ниже вы можете увидеть некоторые вопросы, которые я задавал себе в процессе настройки модели.

Что произойдет, если я изменю целевую переменную с температуры в помещении на изменение температуры в помещении с течением времени?

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

Что произойдет, если я применю дифференцирование с разными задержками?

Применение разности к моим внутренним и наружным данным перед созданием предикторов улучшило мою модель. Попробовав разные задержки, я заметил, что periods=1 был лучшим вариантом для того же набора данных. Я применил дифференцирование с лагом 1, чтобы продолжить настройку модели.

Подходит ли мой метод стандартизации для моих данных?

Я использовал StandardScaler для нормализации и попробовал MinMaxScaler, что улучшило мою оценку R2 и значения MSE.

Что произойдет, если вместо использования данных за пять минут в качестве предикторов я буду использовать данные за десять минут?

Создание предикторов с данными за десять минут не улучшило модель. Фактически, мой тестовый балл уменьшился, а значение MSE увеличилось. Поэтому я вернулся к использованию пятиминутных данных в качестве предикторов.

Моя модель лучше предсказывает ближайшее или далекое будущее?

Я предсказывал будущее на пять минут. Я пробовал использовать прогнозы на одну и десять минут, которые давали лучшие результаты. Поэтому я адаптировался, предсказывая будущее на десять минут.

В конце концов, я принял это как свою рабочую модель.

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

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

Например, я не знал о sktime до того, как мне понадобилось использовать многомерное моделирование временных рядов. Я узнал о библиотеке, изучил все методы и попробовал на собственном опыте с заданными наборами данных на репозитории Alan Turing Institute на GitHub. Когда дело дошло до применения его к моему собственному набору данных, я не смог этого сделать из-за типа файла данных. Позже я узнал о программах, которые конвертируют файлы .csv в .ts /.arff, и затем смог воспользоваться преимуществами sktime. Хотя в то время я не мог использовать этот навык, это натолкнуло меня на идею использовать предыдущие данные для создания предикторов для моей регрессионной модели.