Кластеризация временных рядов для датафрейма

Вопрос или проблема

У меня есть DataFrame с несколькими идентификаторами, у каждого из которых есть свои временные ряды. Здесь я приведу только простой пример. Я хотел бы сгруппировать их на 2 класса (в реальных данных 10 классов). Я пытался использовать кластеризацию временных рядов в этом руководстве, однако это не сработало для меня (поскольку там есть время и т.д.). Можете помочь мне с этим? Вот мой DataFrame:

import pandas as pd 

df = pd.DataFrame()
df['id'] = [1, 2, 3, 4]
df ['value_1'] = [2, 3, 4, 6]
df ['value_2'] = [5, 1, 4, 6]
df ['value_3'] = [2, 2, 4, 9]

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

Здесь главное, что вы не подаете “временной” признак во время обучения. TICC рассматривает каждое время как одно состояние. Вы можете найти более подробную информацию в этой статье: https://cs.stanford.edu/people/jure/pubs/ticc-kdd17.pdf

Спасибо, надеюсь, это было полезно. 🙂

Ответ или решение

Кластеризация временных рядов для датафрейма

Ваша задача заключается в кластеризации временных рядов, имеющих уникальные идентификаторы, на основе значений, представленных в вашем датафрейме. В данной статье мы рассмотрим подходы к кластеризации, такие как использование алгоритмов GMM (Gaussian Mixture Model) и TICC (Time-series Clustering based on Temporal Patterns). Ниже приведены шаги, которые помогут вам эффективно произвести кластеризацию.

Шаг 1: Подготовка данных

Начнем с импорта необходимых библиотек и загрузки ваших данных в pandas DataFrame:

import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler

Вы уже создали DataFrame, который выглядит следующим образом:

df = pd.DataFrame()
df['id'] = [1, 2, 3, 4]
df['value_1'] = [2, 3, 4, 6]
df['value_2'] = [5, 1, 4, 6]
df['value_3'] = [2, 2, 4, 9]

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

Шаг 2: Обработка данных

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

scaler = StandardScaler()
data_scaled = scaler.fit_transform(df[['value_1', 'value_2', 'value_3']])

Шаг 3: Выбор метода кластеризации

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

  1. GMM (Gaussian Mixture Model):
    GMM позволяет модельировать данные как смесь нескольких гауссовских распределений. Для его применения можно использовать библиотеку sklearn.

    from sklearn.mixture import GaussianMixture
    
    n_clusters = 2  # количество кластеров
    
    gmm = GaussianMixture(n_components=n_clusters)
    gmm.fit(data_scaled)
    df['cluster'] = gmm.predict(data_scaled)
  2. TICC (Time-series Clustering based on Temporal Patterns):
    TICC — это алгоритм, который подходит для временных рядов, как указано в вашем запросе. Он позволяет группировать временные ряды с различными распределениями и паттернами.

    Для его применения, вам потребуется механизм, который позволяет организовать ваши данные в правильном формате. Вам также нужно будет установить библиотеку для TICC. Код может выглядеть так:

    from ticc import TICC
    
    ticc = TICC(n_components=2, random_state=42)
    ticc.fit(data_scaled)
    df['cluster'] = ticc.predict()

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

Шаг 4: Анализ результатов

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

import matplotlib.pyplot as plt
import seaborn as sns

sns.scatterplot(x=df['value_1'], y=df['value_2'], hue=df['cluster'], palette='viridis')
plt.title('Кластеризация временных рядов')
plt.xlabel('Value 1')
plt.ylabel('Value 2')
plt.show()

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...