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