Препятствия, с которыми я столкнулся при прогнозировании данных многомерных временных рядов, и способы их преодоления
Были ли у вас временные ряды с многомерными столбцами, временные ряды, в которых ваши столбцы не находятся в одном диапазоне размеров или даже в одном и том же типе данных, что приводило к невозможности применения моделей 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. Хотя в то время я не мог использовать этот навык, это натолкнуло меня на идею использовать предыдущие данные для создания предикторов для моей регрессионной модели.