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

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

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

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

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

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

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

Извлечение признаков временных рядов

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

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

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

Мы можем извлечь функции, используя функции из pandas или numpy. Или мы можем немного упростить себе жизнь и автоматизировать извлечение признаков с помощью tsfresh.

Автоматизация извлечения признаков

tsfresh — это пакет Python, который автоматически вычисляет несколько сотен характеристик/функций временных рядов. К ним относятся простые функции, такие как минимум или медиана, а также более сложные, такие как корреляция. Пакет также предоставляет методы, которые оценивают актуальность/важность каждой функции. Мы можем установить tsfresh, запустив pip install tsfresh.

Я покажу вам, как использовать tsfresh на основе временных рядов профиля электрической нагрузки. Мой DataFrame содержит значение активной мощности P для каждого day в определенный time. Как видите, профиль электрической нагрузки имеет 15-минутное разрешение и охватывает дни с конца мая 2020 года по конец июня 2021 года.

Чтобы извлечь функции нашего временного ряда, нам нужно запустить функцию extract_features() и передать данные временного ряда в виде DataFrame. Более того, нам нужно указать Формат данных наших данных.

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

Поскольку мы хотим извлечь характеристики временного ряда, важно, чтобы значения были отсортированы по времени. Чтобы обеспечить сортировку временных рядов, мы передаем столбец с указанием временных шагов в параметр column_sort.

Функция возвращает DataFrame, который содержит все извлеченные функции для каждой сущности.

from tsfresh import extract_features
extracted_features = extract_features(timeseries, column_id="date", column_sort="time", impute_function=impute)

Поскольку часто не все функции могут быть рассчитаны, будут функции со значениями NaN. Мы можем удалить их, передав параметр impute_function или выполнив:

from tsfresh.utilities.dataframe_functions import impute

impute(extracted_features)

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

fc_parameters = {'sum_values': None, 
'median': None,
'mean': None,
'standard_deviation': None,
'variation_coefficient': None,
'variance': None,
'skewness': None,
'kurtosis': None,
'last_location_of_maximum': None,
'first_location_of_maximum': None,
'last_location_of_minimum': None,
'first_location_of_minimum': None,
'maximum': None,
'minimum': None,
'number_peaks': [{'n': 1}, {'n': 3}, {'n': 5}, {'n': 10}]}
extract_features = extract_features(timeseries, column_id="date", column_sort="time", impute_function=impute, default_fc_parameters=fc_parameters)

Чтобы посмотреть, какие функции вы можете выбрать, вы можете посмотреть параметры tsfresh, запустив:

from tsfresh.feature_extraction import ComprehensiveFCParameters
fc_parameters = ComprehensiveFCParameters()

Автоматический выбор функций

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

Мы можем отфильтровать функции, используя функцию select_features() tsfresh и передав целевой вектор в виде серии pandas или массива numpy:

from tsfresh import select_features
features_filtered = select_features(extracted_features, target)

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

from tsfresh import extract_relevant_features
extract_relevant_features(timeseries, y, column_id='date', column_sort='time')

Заключение

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

Если вам понравилась статья и/или у вас есть какие-либо комментарии, я буду рад их услышать.