[PYTHON] Bibliothèque tsfresh qui extrait automatiquement les caractéristiques des données de séries chronologiques

Le cinquième jour du Calendrier de l'avent Ateam Lifestyle 2019 Kobayashi, ingénieur dans la salle CTO d'A-Team Lifestyle Co., Ltd., est responsable. L'entreprise travaille sur un projet d'apprentissage automatique.

introduction

Récemment, je m'occupe de données de séries chronologiques au travail et d'une bibliothèque pratique qui extrait automatiquement les caractéristiques des données de séries chronologiques appelées tsfresh Ceci est une introduction car je l'ai utilisé. L'ordre des données de la série chronologique est significatif, mais la signification n'était pas très bonne, le contexte était donc d'étudier la méthode d'extraction des caractéristiques. Dans l'exemple de la prévision des données de séries chronologiques,

Etc. On peut s'attendre à ce qu'il soit plus précis de traiter les données avec sens que de traiter individuellement les données disposées en séries chronologiques. Étant donné que tsfresh extrait les caractéristiques des données de séries chronologiques, il semble pouvoir contribuer à améliorer la précision.

Il y a Comment utiliser notebook sur Github de tsfresh, alors référez-vous-y et [Google Colaboratory](https :: //colab.research.google.com/notebooks/welcome.ipynb?hl=ja#scrollTo=xitplqMNk_Hc). Google Colaboratory est un environnement dans lequel vous pouvez utiliser Jupyter Notebook gratuitement. Son utilisation est limitée à la recherche et à l'éducation en apprentissage automatique, mais il est recommandé car c'est un excellent service que vous pouvez utiliser gratuitement GPU et TPU et disposer d'une bibliothèque Python pour l'apprentissage automatique dès le début.

Préparation

Tout d'abord, installez tsfresh. Voici la méthode de description sur le bloc-notes Jupyter.

!pip install tsfresh

Importer les packages requis

%matplotlib inline
import matplotlib.pylab as plt
from tsfresh.examples.har_dataset import download_har_dataset, load_har_dataset, load_har_classes
from tsfresh import extract_features, extract_relevant_features, select_features
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
import xgboost as xgb
import pandas as pd
import numpy as np

Télécharger les données

# fetch dataset from uci
download_har_dataset()
df = load_har_dataset()
print(df.head())
df.shape
        0         1         2    ...       125       126       127
0  0.000181  0.010139  0.009276  ... -0.001147 -0.000222  0.001576
1  0.001094  0.004550  0.002879  ... -0.004646 -0.002941 -0.001599
2  0.003531  0.002285 -0.000420  ...  0.001246  0.003117  0.002178
3 -0.001772 -0.001311  0.000388  ... -0.000867 -0.001172 -0.000028
4  0.000087 -0.000272  0.001022  ... -0.000698 -0.001223 -0.003328

[5 rows x 128 columns]
(7352, 128)

Ces données sont la valeur numérique du capteur d'accélération de 128 séries temporelles dans chaque ligne. Il semble être classé en 6 catégories (marcher, monter les escaliers, descendre les escaliers, s'asseoir, se tenir debout, dormir). Source des données: https://archive.ics.uci.edu/ml/datasets/Human+Activity+Recognition+Using+Smartphones

Affiche une ligne sous forme de graphique.

plt.title('accelerometer reading')
plt.plot(df.ix[0,:])
plt.show()

スクリーンショット 2019-12-02 6.29.13.png

Extraction de caractéristiques

Échantillonnez et formatez les données.

N = 500
master_df = pd.DataFrame({0: df[:N].values.flatten(),
                          1: np.arange(N).repeat(df.shape[1])})
master_df.head()
	0	1
0	0.000181	0
1	0.010139	0
2	0.009276	0
3	0.005066	0
4	0.010810	0

Les données alignées horizontalement sur 128 colonnes sont triées verticalement afin que tsfresh puisse les gérer. La colonne 0 est les données et la colonne 1 est l'index (numéro de ligne des données d'origine). Nous utiliserons ces données pour extraire des fonctionnalités. La colonne de l'index est spécifiée par column_id.

X = extract_features(master_df, column_id=1)
Feature Extraction: 100%|██████████| 5/5 [01:02<00:00, 12.48s/it]

Cela a pris environ 1 minute pour 500 lignes. Lorsque je l'ai essayé avec plus de 100000 lignes de données, cela a pris beaucoup de temps et de la mémoire était nécessaire, il semble donc qu'une certaine ingéniosité soit nécessaire pour l'appliquer à des données à grande échelle.

X.shape
(500, 754)

Jusqu'à 754 quantités de caractéristiques ont été extraites. Je n'ai pas confirmé le contenu en détail, mais il semble que diverses caractéristiques telles que la transformée de Fourier soient calculées à partir de choses de base telles que la moyenne et la médiane.

Vérification de l'exactitude

Essayons d'apprendre et de prédire en utilisant les fonctionnalités extraites. Tout d'abord, préparez les données de l'enseignant.

y = load_har_classes()[:N]
y.hist(bins=12)

スクリーンショット 2019-12-02 8.55.10.png

Il semble qu'il n'y ait pas de variation aussi extrême. Divisez en données d'entraînement et données de test.

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.2)

Apprenons et prédisons avec xgboost.

cl = xgb.XGBClassifier()
cl.fit(X_train, y_train)
print(classification_report(y_test, cl.predict(X_test)))
              precision    recall  f1-score   support

           1       1.00      1.00      1.00        24
           2       1.00      1.00      1.00        11
           3       1.00      1.00      1.00        12
           4       0.62      0.53      0.57        15
           5       0.70      0.74      0.72        19
           6       0.60      0.63      0.62        19

    accuracy                           0.81       100
   macro avg       0.82      0.82      0.82       100
weighted avg       0.81      0.81      0.81       100

Il semble que la précision soit d'environ 80%. Regardons également l'importance des quantités de caractéristiques.

importances = pd.Series(index=X_train.columns, data=cl.feature_importances_)
importances.sort_values(ascending=False).head(10)
variable
0__spkt_welch_density__coeff_8                                   0.054569
0__time_reversal_asymmetry_statistic__lag_3                      0.041737
0__agg_linear_trend__f_agg_"max"__chunk_len_5__attr_"stderr"     0.036145
0__standard_deviation                                            0.035886
0__change_quantiles__f_agg_"var"__isabs_False__qh_0.4__ql_0.0    0.028676
0__spkt_welch_density__coeff_2                                   0.027741
0__augmented_dickey_fuller__attr_"pvalue"                        0.019172
0__autocorrelation__lag_2                                        0.018580
0__linear_trend__attr_"stderr"                                   0.018235
0__cid_ce__normalize_True                                        0.018181
dtype: float32

Il semble que vous puissiez voir quel type de montant de fonctionnalité est créé à partir du nom de la variable. Entraînons-nous avec l'ensemble de données d'origine à des fins de comparaison.

X_1 = df.ix[:N-1,:]
X_1.shape
(500, 128)
X_train, X_test, y_train, y_test = train_test_split(X_1, y, test_size=.2)
cl = xgb.XGBClassifier()
cl.fit(X_train, y_train)
print(classification_report(y_test, cl.predict(X_test)))
              precision    recall  f1-score   support

           1       0.79      0.83      0.81        36
           2       0.71      0.67      0.69        15
           3       0.58      0.58      0.58        12
           4       0.25      0.43      0.32         7
           5       0.67      0.53      0.59        19
           6       0.44      0.36      0.40        11

    accuracy                           0.64       100
   macro avg       0.57      0.57      0.56       100
weighted avg       0.65      0.64      0.64       100

La précision des données d'origine est d'environ 64%, les données extraites par tsfresh sont donc plus précises.

Résumé

En utilisant tsfresh pour extraire des fonctionnalités à partir de données de séries chronologiques, nous avons pu améliorer la précision. Avant l'extraction, l'ordre des données de la série chronologique ne pouvait pas être significatif, donc je pense que c'est le résultat de pouvoir donner un sens. Je n'ai pas vu en détail le type de données extraites, alors j'aimerais savoir de quel type de données il s'agit.

Le 7ème jour du Calendrier de l'Avent Ateam Lifestyle 2019 sera envoyé par @maonem. J'ai hâte d'y être!

Le groupe A-Team, qui valorise le «défi», recherche des collègues avec un fort esprit de défi avec qui travailler. Si vous êtes intéressé, veuillez visiter le site de recrutement de A-Team Group. https://www.a-tm.co.jp/recruit/

Recommended Posts

Bibliothèque tsfresh qui extrait automatiquement les caractéristiques des données de séries chronologiques
Quantité d'entités pouvant être extraite des données de séries chronologiques
Extraire les périodes qui correspondent à un modèle spécifique des données qualitatives de séries chronologiques de pandas
[Python] Tracer des données de séries chronologiques
Programme Python qui agrège l'utilisation du temps à partir des données icalendar
Comment extraire des fonctionnalités de données de séries chronologiques avec les bases de PySpark
[numpy] Créer une matrice de fenêtre mobile à partir de données de séries chronologiques multidimensionnelles
Python: analyse des séries chronologiques: prétraitement des données des séries chronologiques
À propos des données de séries chronologiques et du surentraînement
Différenciation des données de séries chronologiques (discrètes)
Analyse des séries chronologiques 3 Prétraitement des données des séries chronologiques
[Kaggle] J'ai essayé l'ingénierie de quantité de caractéristiques de données de séries chronologiques multidimensionnelles à l'aide de tsfresh
Prédiction des données de séries chronologiques par projection simplex
Prédire les données de séries chronologiques avec un réseau neuronal
Détection d'anomalies de données chronologiques pour les débutants
Comment gérer les données de séries chronologiques (mise en œuvre)
Lecture des données de séries chronologiques OpenFOAM et des ensembles de données