Implémentation de la méthode de clustering k-shape pour les données de séries chronologiques [Apprentissage non supervisé avec python Chapitre 13]

Que faire dans cet article

** - Mise en œuvre de la classification des données de séries chronologiques par forme de k --Utiliser les données d'électrocardiogramme pour les données **

introduction

La méthode k-shape est souvent utilisée comme méthode de classification des données de séries chronologiques. Dans cet article, nous utiliserons la méthode k-shape pour regrouper les données ECG. Données et code ["Apprentissage non supervisé avec python"](url https://www.amazon.co.jp/Python%E3%81%A7%E3%81%AF%E3%81%98%E3%82 % 81% E3% 82% 8B% E6% 95% 99% E5% B8% AB% E3% 81% AA% E3% 81% 97% E5% AD% A6% E7% BF% 92-% E2% 80% 95% E6% A9% 9F% E6% A2% B0% E5% AD% A6% E7% BF% 92% E3% 81% AE% E5% 8F% AF% E8% 83% BD% E6% 80% A7% E3% 82% 92% E5% BA% 83% E3% 81% 92% E3% 82% 8B% E3% 83% A9% E3% 83% 99% E3% 83% AB% E3% 81% AA% E3% 81% 97% E3% 83% 87% E3% 83% BC% E3% 82% BF% E3% 81% AE% E5% 88% A9% E7% 94% A8-Ankur-Patel / dp / 4873119103) J'ai le droit de le faire.

Données à traiter

Utilisez les archives de classification des séries chronologiques UCR de l'Université de Californie à Riverside. https://www.cs.ucr.edu/~eamonn/time_series_data/

ECG5000 est utilisé. Le mot de passe est [tentative de classification].

Importer la bibliothèque

Ceci est un livre de référence. Certains d'entre eux ne sont pas traités dans cet article.

L'installation est requise lors de l'exécution avec colab.

python


!pip install kshape
!pip install tslearn

python



'''Main'''
import numpy as np
import pandas as pd
import os, time, re
import pickle, gzip, datetime
from os import listdir, walk
from os.path import isfile, join

'''Data Viz'''
import matplotlib.pyplot as plt
import seaborn as sns
color = sns.color_palette()
import matplotlib as mpl
from mpl_toolkits.axes_grid1 import Grid

%matplotlib inline

'''Data Prep and Model Evaluation'''
from sklearn import preprocessing as pp
from sklearn.model_selection import train_test_split 
from sklearn.model_selection import StratifiedKFold 
from sklearn.metrics import log_loss, accuracy_score
from sklearn.metrics import precision_recall_curve, average_precision_score
from sklearn.metrics import roc_curve, auc, roc_auc_score, mean_squared_error
from keras.utils import to_categorical
from sklearn.metrics import adjusted_rand_score
import random

'''Algos'''
from kshape.core import kshape, zscore
import tslearn
from tslearn.utils import to_time_series_dataset
from tslearn.clustering import KShape, TimeSeriesScalerMeanVariance
from tslearn.clustering import TimeSeriesKMeans
import hdbscan

sns.set("talk")

Lecture des données

Ensuite, lit les données. Il existe 4000 données chronologiques et les données sont classées en 5 groupes.

python


#Lecture des données
current_path = os.getcwd()
file = os.path.sep.join(["",'data', 'datasets', 'ucr_time_series_data', '']) #Réécrire selon le dossier personnel
data_train = np.loadtxt(current_path+file+
                        "ECG5000/ECG5000_TRAIN", 
                        delimiter=",")

data_test = np.loadtxt(current_path+file+
                       "ECG5000/ECG5000_TEST", 
                       delimiter=",")

data_joined = np.concatenate((data_train,data_test),axis=0)
data_train, data_test = train_test_split(data_joined, 
                                    test_size=0.20, random_state=2019)

X_train = to_time_series_dataset(data_train[:, 1:])
y_train = data_train[:, 0].astype(np.int)
X_test = to_time_series_dataset(data_test[:, 1:])
y_test = data_test[:, 0].astype(np.int)

#Afficher la structure des données
print("Number of time series:", len(data_train))
print("Number of unique classes:", len(np.unique(data_train[:,0])))
print("Time series length:", len(data_train[0,1:]))

# Calculate number of readings per class
print("Number of time series in class 1.0:", 
      len(data_train[data_train[:,0]==1.0]))
print("Number of time series in class 2.0:", 
      len(data_train[data_train[:,0]==2.0]))
print("Number of time series in class 3.0:", 
      len(data_train[data_train[:,0]==3.0]))
print("Number of time series in class 4.0:", 
      len(data_train[data_train[:,0]==4.0]))
print("Number of time series in class 5.0:", 
      len(data_train[data_train[:,0]==5.0]))

"""
Number of time series: 4000
Number of unique classes: 5
Time series length: 140
Number of time series in class 1.0: 2327
Number of time series in class 2.0: 1423
Number of time series in class 3.0: 75
Number of time series in class 4.0: 156
Number of time series in class 5.0: 19
"""

Visualisation de données

Visualisez les données des classes 1 à 5. Même si vous regardez un amateur, vous ne pouvez pas faire la différence.

python



fig, ax = plt.subplots(5,5,figsize=[30,10],sharey=True)

ax_f = ax.flatten()

#Parcelle de classe1-5
df_train = pd.DataFrame(data_train)

cnt = 0
for class_i in range(1,6):
  df_train_plot = df_train[df_train[0] == class_i]
  for i in range(0,5):
      ax_f[cnt].set_title("class: {}".format(class_i))
      ax_f[cnt].plot(df_train_plot.iloc[i][1:])
      cnt += 1

image.png

Classification par forme de k

Implémentation de k-shape et son évaluation. Pour l'évaluation, une méthode appelée «méthode des terres d'ajustement» est utilisée, et plus elle est proche de 1, plus la précision du regroupement est élevée.

python


#k-shape
ks = KShape(n_clusters=5,max_iter=100,n_init=100,verbose=0)
ks.fit(X_train)

#Évaluation par la méthode des terres ajustées
#Voyez à quel point il correspond à l'étiquette réelle
#Plus il est proche de 1, plus le clustering est prédictif.

preds=ks.predict(X_train)
ars = adjusted_rand_score(data_train[:,0],preds)
print("train Adjusted Rand Index:",ars)

preds_test=ks.predict(X_test)
ars = adjusted_rand_score(data_test[:,0],preds)
print("test Adjusted Rand Index:",ars)
UCR Time Series Classification Archive

En outre, la distribution de classe pour chaque cluster est indiquée ci-dessous. Comme la distribution est biaisée, le regroupement est assez bon.

Cependant, il convient de noter que la division n'est pas telle que le nombre de 3,4,5 soit le plus grand.

python



#Visualisation de la distribution à l'intérieur du cluster
preds_test = preds_test.reshape(1000,1)
preds_test = np.hstack((preds_test,data_test[:,0].reshape(1000,1)))
preds_test = pd.DataFrame(data=preds_test)
preds_test = preds_test.rename(columns={0: 'prediction', 1: 'actual'})

counter = 0
for i in np.sort(preds_test.prediction.unique()):
    print("Predicted Cluster ", i)
    print(preds_test.actual[preds_test.prediction==i].value_counts())
    print()
    cnt = preds_test.actual[preds_test.prediction==i] \
                        .value_counts().iloc[1:].sum()
    counter = counter + cnt
print("Count of Non-Primary Points: ", counter)

"""
Predicted Cluster  0.0
2.0    29
4.0     2
1.0     2
3.0     2
5.0     1
Name: actual, dtype: int64

Predicted Cluster  1.0
2.0    270
4.0     14
3.0      8
1.0      2
5.0      1
Name: actual, dtype: int64

Predicted Cluster  2.0
1.0    553
4.0     16
2.0      9
3.0      7
Name: actual, dtype: int64

Predicted Cluster  3.0
2.0    35
1.0     5
4.0     5
5.0     3
3.0     3
Name: actual, dtype: int64

Predicted Cluster  4.0
1.0    30
4.0     1
3.0     1
2.0     1
Name: actual, dtype: int64

Count of Non-Primary Points:  83
"""

À la fin

Dans cet article, nous avons implémenté k-shape, qui est une méthode de clustering pour les données de séries chronologiques. C'est assez similaire à faire des k-means. Je pense que ce sera utile pour le traitement du signal et la détection d'anomalies.

Si vous le trouvez utile, il serait encourageant d'utiliser LGTM.

Recommended Posts

Implémentation de la méthode de clustering k-shape pour les données de séries chronologiques [Apprentissage non supervisé avec python Chapitre 13]
Apprentissage supervisé de mnist dans la couche entièrement connectée, clustering et évaluation de l'étape finale
Implémentation de la méthode de clustering k-shape pour les données de séries chronologiques [Apprentissage non supervisé avec python Chapitre 13]
Classer les numéros mnist par keras sans apprentissage par l'enseignant [Auto Encoder Edition]
Apprentissage des données relationnelles avec numpy et NetworkX (clustering spectral)
Apprentissage non supervisé 2 clustering non hiérarchique
Tracer CSV de données de séries temporelles avec une valeur unixtime en Python (matplotlib)
Deep Learning from scratch La théorie et la mise en œuvre de l'apprentissage profond appris avec Python Chapitre 3
Alignez le nombre d'échantillons entre les classes de données pour l'apprentissage automatique avec Python
Prédire le temps objectif d'un marathon complet avec l'apprentissage automatique-③: j'ai essayé de visualiser les données avec Python-
Python pour l'analyse des données Chapitre 4
Python pour l'analyse des données Chapitre 2
Python: apprentissage non supervisé: clustering non hiérarchique
Python pour l'analyse des données Chapitre 3
Système de recommandation utilisant la décomposition matricielle [Apprentissage non supervisé avec python Chapitre 10]
Une histoire de regroupement de données de séries chronologiques d'échange
Comment extraire des fonctionnalités de données de séries chronologiques avec les bases de PySpark
Python: analyse des séries chronologiques: prétraitement des données des séries chronologiques
À propos de la méthode d'apprentissage avec les données originales de CenterNet (Objects as Points)
Perceptron multi-couches pour le Deep Learning (Deep Learning avec Python; Série MPS Yokohama Deep Learning)
Différenciation des données de séries chronologiques (discrètes)
Implémentation de la méthode Dyxtra par python
Analyse des séries chronologiques 3 Prétraitement des données des séries chronologiques
Réécrivez le nœud de création de champ de SPSS Modeler avec Python. Extraction de caractéristiques à partir de données de capteurs de séries temporelles
[Pour les débutants] Script dans les 10 lignes (5. Rééchantillonnage des données de séries chronologiques à l'aide de pandas)
Code source pour la séparation des sources sonores (série de pratiques d'apprentissage automatique) appris avec Python
Mémo d'apprentissage Python pour l'apprentissage automatique par Chainer Chapitre 13 Bases du réseau neuronal
Mémo d'apprentissage Python pour l'apprentissage automatique par Chainer jusqu'à la fin du chapitre 2
Python vs Ruby "Deep Learning from scratch" Chapitre 4 Implémentation de la fonction de perte
Prédiction des données de séries chronologiques par projection simplex
Mise en œuvre et expérience de la méthode de clustering convexe
Prédire les données de séries chronologiques avec un réseau neuronal
[Python] Accélère le chargement du fichier CSV de séries chronologiques
[Shakyo] Rencontre avec Python pour l'apprentissage automatique
Détection d'anomalies de données chronologiques pour les débutants
Recommandation d'Altair! Visualisation des données avec Python
Analyse de données à partir de python (pré-traitement des données-apprentissage automatique)
Comment gérer les données de séries chronologiques (mise en œuvre)
Formater et afficher des données de séries chronologiques avec différentes échelles et unités avec Python ou Matplotlib
Analyse des données de pratique Python Résumé de l'apprentissage que j'ai atteint environ 10 avec 100 coups
Python vs Ruby "Deep Learning from scratch" Chapitre 3 Implémentation d'un réseau neuronal à 3 couches
Créez une carte chronologique animée de l'état de l'infection par le virus corona avec python + plotly
Un mémorandum de méthode souvent utilisé lors de l'analyse de données avec des pandas (pour les débutants)
[Introduction à Python] Comment obtenir l'index des données avec l'instruction for
Obtenez des données de séries chronologiques de k-db.com avec Python
L'histoire selon laquelle le coût d'apprentissage de Python est faible
Résumé de la méthode Kaggle's Kernel [Table time series data]
Acquisition de données chronologiques (quotidiennes) des cours des actions
Utilisez Logger avec Python pour le moment
[Python] Collectez des images avec Icrawler pour l'apprentissage automatique [1000 feuilles]
Lissage des séries temporelles et des données de forme d'onde 3 méthodes (lissage)
Implémentation de l'arbre TRIE avec Python et LOUDS
[Implémentation pour l'apprentissage] Implémentation de l'échantillonnage stratifié en Python (1)
J'ai commencé l'apprentissage automatique avec le prétraitement des données Python
Introduction au Deep Learning pour la première fois (Chainer) Reconnaissance de caractères japonais Chapitre 4 [Amélioration de la précision de la reconnaissance en développant les données]
Implémentation du modèle Deep Learning pour la reconnaissance d'images
[Hikari-Python] Chapitre 09-01 Classes (Bases des objets)
La première étape de l'apprentissage automatique ~ Pour ceux qui veulent essayer l'implémentation avec python ~
[Français] didacticiel scikit-learn 0.18 Didacticiel d'apprentissage statistique pour le traitement des données scientifiques Apprentissage non supervisé: recherche de représentation des données
Construisez un serveur API pour vérifier le fonctionnement de l'implémentation frontale avec python3 et Flask
[Dernière méthode] Visualisation des données de séries chronologiques et extraction de modèles fréquents à l'aide du profil Pan-Matrix
"Obtenir des données de séries chronologiques de stock à partir de k-db.com avec Python" Mémo de création d'environnement de programme
Clustering de méthodes de clustering
[Python] Implémentation du clustering à l'aide d'un modèle gaussien mixte