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é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
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.
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()
Obtenez la figure ci-dessous. La ligne rouge semble être la forme d'onde la plus proche du centre de chaque cluster.
(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