[PYTHON] Mémorandum de procès tslearn

Aperçu

Il existe un package puissant appelé tslearn pour le clustering des données chronologiques, et un mémorandum lors de la vérification de l'opération Il semble qu'il peut être utilisé au travail, alors je mange un peu

Création d'un environnement virtuel Conda pour le contrôle de fonctionnement

Créez un nouvel environnement virtuel pour le contrôle de fonctionnement selon la procédure de Miniconda Install memorandum Ensuite, installez les packages suivants requis

conda install -c conda-forge tslearn
conda install -c conda-forge h5py

La procédure pour tslearn également telle qu'écrite, et les éléments suivants sont également requis. scikit-learn, numpy, scipy

Préparation

Les trois méthodes suivantes sont implémentées dans le [Clustering] de tslearn (https://tslearn.readthedocs.io/en/stable/gen_modules/tslearn.clustering.html#module-tslearn.clustering).

Cette fois, j'utiliserai une méthode appelée K-Shape. Un aperçu de K-Shape peut être trouvé dans ce blog, à partir duquel vous pouvez également vous référer à l'article original.

Cette fois, nous allons essayer de regrouper des formes d'onde arythmiques basées sur [exemple de code officiel] de tslearn (https://tslearn.readthedocs.io/en/stable/auto_examples/clustering/plot_kshape.html?highlight=KShape). Les données utilisées étaient ECG Heartbeat Categorization Dataset de Kaggle. Puisqu'il ne s'agit pas d'un DNN, téléchargez uniquement mitbih_train.csv. 187 points de données de forme d'onde à 125 Hz et la dernière colonne sont étiquetés 0-4. «0» est la forme d'onde normale, et à part cela, il semble être une forme d'onde différente pour chaque symptôme. Il y a 87554 cas au total, mais mélangez et utilisez 100 points. Réservez également l'étiquette pour confirmer que le clustering a réussi plus tard.

code

Importez les bibliothèques requises.

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

from tslearn.clustering import KShape
from tslearn.datasets import CachedDatasets
from tslearn.preprocessing import TimeSeriesScalerMeanVariance

Formatez les données et mettez enfin à l'échelle.

train_df=pd.read_csv('/home/hoge/mitbih_train.csv',header=None)
trainArr = []
trainArr = train_df.values
np.random.shuffle(trainArr)

trainArr_X = []
trainArr_y = []
trainArr_X = trainArr[:100, :187]
trainArr_y = trainArr[:100, -1:]
trainArr_X = trainArr_X.reshape([100, 187, 1])
print(trainArr_X.shape)         # (100, 187, 1)
print(trainArr_y.shape)         # (100, 1)
sz = trainArr_X.shape[1]

# For this method to operate properly, prior scaling is required
trainArr_X = TimeSeriesScalerMeanVariance().fit_transform(trainArr_X)

Effectuez la mise en cluster et affichez les résultats. Il y avait 5 classes.

# kShape clustering
ks = KShape(n_clusters=5, verbose=True, random_state=seed)
y_pred = ks.fit_predict(trainArr_X)

plt.figure(figsize=(10, 10), tight_layout = True)
for yi in range(5):
    plt.subplot(5, 1, 1 + yi)
    
    for xx in trainArr_X[y_pred == yi]:
        plt.plot(xx.ravel(), "b-", alpha=.2)
    plt.plot(ks.cluster_centers_[yi].ravel(), "r-")
    plt.xlim(0, sz)
    plt.ylim(-8, 8)
    plt.title("Cluster %d" % (yi + 1))

plt.show()

résultat

Obtenez la figure ci-dessous. La ligne rouge semble être la forme d'onde la plus proche du centre de chaque cluster.

Screenshot from 2020-10-04 16-18-33.png

(Je voulais vraiment coder en couleur 100 lignes par trainArr_y pour chaque nom de maladie, mais je n'ai pas pu l'écrire immédiatement en raison d'un manque de puissance Python, donc je le soutiendrai plus tard) Le nombre d'étiquettes des 100 données originales utilisées ici (sans rapport avec le numéro de cluster dans la figure ci-dessus) est le suivant. «0»: 86 pièces, «1»: 2 pièces, «2»: 4 pièces, «3»: 2 pièces, «4»: 6 pièces

Comme le nombre d'étiquettes et le nombre de chaque classe sont clairement différents, il semble qu'il ne puisse pas être utilisé sans rien ajuster. Recherchez les types de paramètres disponibles. Les données brutes ont été complétées de zéro sur 187 points dans la seconde moitié. Je me suis précipité comme ça, mais il semble que ce n'était pas un problème.

Le code qui classe cet ensemble de données avec CNN est également en Kaggle, et la précision est également remarquablement bonne.

Recommended Posts

Mémorandum de procès tslearn
Mémorandum Matplotlib
mémorandum Linux
mémorandum jinja2
Mémorandum Python
Mémorandum Django
Mémorandum Python 2
mémorandum complot
Mémorandum Slackbot (1)
Essai GDB
mémorandum de multitraitement
Mémorandum MetaTrader5
mémorandum pip
Mémorandum Python
mémorandum pydoc
mémorandum python
Mémorandum de Pandas
mémorandum python
Mémorandum DjangoGirls
Mémorandum de commandement
Mémorandum Python
mémorandum pandas
mémorandum python
Mémorandum Python