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

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

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

Как мы классифицируем временные ряды?

Существует множество методов классификации данных временных рядов. Некоторые из стандартных хорошо известных методов используют K-ближайших соседей с различными мерами упругого расстояния, такими как динамическая деформация времени (DTW), редактирование деформации времени (TWE) или расстояние, не зависящее от сложности (CID), для идентификации классов в данных.

У нас также есть методы глубокого обучения, которые демонстрируют потенциал в прогнозировании временных рядов с помощью таких методов, как автоматическое изучение временной зависимости. Однако из-за высокой размерности данных временных рядов эти методы оказываются дорогостоящими с точки зрения времени обучения и требований к памяти. Учитывая высокую вычислительную нагрузку при использовании традиционных алгоритмов, Йе и Кио предложили концепцию, известную как Shapelets.

Что такое шейплеты?

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

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

Реализации Shapelet

Большинство реализаций шейплета было выполнено на C++ или Java, и в стандартной библиотеке Python нет официальных реализаций этих алгоритмов. В настоящее время я также работаю над репозиторием GitHub на python, чтобы идентифицировать шейплеты и классифицировать их. Некоторые из реализаций шейплетов с открытым исходным кодом на Python, доступных прямо сейчас, упомянуты ниже:

Learning Time-Series Shapelets by mohaseeb

Источник: shaplets-python

Установка

git clone [email protected]:mohaseeb/shaplets-python.git
cd shaplets-python
pip install .

Использование

from shapelets_lts.classification import LtsShapeletClassifier

# create an LtsShapeletClassifier instance
classifier = LtsShapeletClassifier(
    K=20,
    R=3,
    L_min=30,
    epocs=50,
    lamda=0.01,
    eta=0.01,
    shapelet_initialization='segments_centroids',
    plot_loss=True
)

# train the classifier. 
# train_data.shape -> (# train samples X time-series length) 
# train_label.shape -> (# train samples)
classifier.fit(train_data, train_label, plot_loss=True)

# evaluate on test data. 
# test_data.shape -> (# test samples X time-series length)
prediction = classifier.predict(test_data)

# retrieve the learnt shapelets
shapelets = classifier.get_shapelets()

# and plot sample shapelets
from shapelets_lts.util import plot_sample_shapelets
plot_sample_shapelets(shapelets=shapelets, sample_size=36)

Sktime от Института Алана Тьюринга

Источник: sktime

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

Установка

pip install sktime

or

conda install -c conda-forge sktime

Использование

from sktime.transformers.series_as_features.shapelets import ContractedShapeletTransform
# How long (in minutes) to extract shapelets for.
time_contract_in_mins = <time to search>

# The initial number of shapelet candidates to assess per training series. 
initial_num_shapelets_per_case = <no of shapelets>

ShapeletTransformer = ContractedShapeletTransform(     time_contract_in_mins=time_contract_in_mins,
num_candidates_to_sample_per_case=initial_num_shapelets_per_case)
ShapeletTransformer.fit(train_x, train_y)
#Plot the shapelets
for i in range(0,min(len(ShapeletTransformer.shapelets),5)):
    s = ShapeletTransformer.shapelets[i]
    # summary info about the shapelet
    print("#"+str(i)+": "+str(s))

    # overlay shapelets
    plt.plot(
        list(range(s.start_pos,(s.start_pos+s.length))),
        train_x.iloc[s.series_id,0][s.start_pos:s.start_pos+s.length]
    )

plt.show()

Заключение

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

Большое спасибо за чтение! Дайте мне знать, если у вас есть какие-либо вопросы или комментарии.

Об авторе:

Рохит Винсент — консультант по аналитике данных здесь, в версии 1.