[PYTHON] Bibliothek tsfresh, die Features automatisch aus Zeitreihendaten extrahiert

Der fünfte Tag des Ateam Lifestyle Adventskalenders 2019 Kobayashi, Ingenieur im CTO-Raum von A-Team Lifestyle Co., Ltd., ist verantwortlich. Das Unternehmen arbeitet an einem Projekt für maschinelles Lernen.

Einführung

Vor kurzem beschäftige ich mich mit Zeitreihendaten bei der Arbeit und einer praktischen Bibliothek, die automatisch Features aus Zeitreihendaten mit dem Namen [tsfresh] extrahiert (https://tsfresh.readthedocs.io/en/latest/index.html). Dies ist eine Einführung, weil ich verwendet habe. Die Reihenfolge der Zeitreihendaten ist aussagekräftig, aber die Bedeutung war nicht so gut, sodass der Hintergrund darin bestand, die Methode zur Merkmalsextraktion zu untersuchen. Im Beispiel der Vorhersage von Zeitreihendaten

Und so weiter. Es ist zu erwarten, dass es genauer ist, die Daten mit einer Bedeutung in der Reihenfolge zu behandeln, als die Daten in chronologischer Reihenfolge einzeln zu behandeln. Da tsfresh Features aus Zeitreihendaten extrahiert, scheint es in der Lage zu sein, zur Verbesserung der Genauigkeit beizutragen.

Es gibt Verwendung des Notizbuchs auf Github von tsfresh. Lesen Sie es und [Google Colaboratory](https :: //colab.research.google.com/notebooks/welcome.ipynb?hl=ja#scrollTo=xitplqMNk_Hc). Google Colaboratory ist eine Umgebung, in der Sie Jupyter Notebook kostenlos verwenden können. Die Verwendung beschränkt sich auf Forschung und Lehre im Bereich des maschinellen Lernens. Es wird jedoch empfohlen, GPU und TPU kostenlos zu verwenden und von Anfang an über eine Python-Bibliothek für maschinelles Lernen zu verfügen.

Vorbereitung

Installieren Sie zunächst tsfresh. Das Folgende ist die Beschreibungsmethode auf dem Jupyter Notebook.

!pip install tsfresh

Importieren Sie die erforderlichen Pakete

%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

Daten herunterladen

# 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)

Diese Daten sind der numerische Wert des Beschleunigungssensors von 128 Zeitreihen in jeder Zeile. Es scheint in 6 Kategorien eingeteilt zu sein (Gehen, Treppensteigen, Treppensteigen, Sitzen, Stehen, Schlafen). Datenquelle: https://archive.ics.uci.edu/ml/datasets/Human+Activity+Recognition+Using+Smartphones

Lassen Sie uns eine Linie als Grafik anzeigen.

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

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

Merkmalsextraktion

Probieren und formatieren Sie die Daten.

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

Die Daten, die horizontal in 128 Spalten angeordnet waren, werden vertikal sortiert, damit tsfresh damit umgehen kann. Spalte 0 sind die Daten und Spalte 1 ist der Index (Zeilennummer der Originaldaten). Wir werden diese Daten verwenden, um Features zu extrahieren. Die Spalte des Index wird durch column_id angegeben.

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

Es dauerte ungefähr 1 Minute für 500 Zeilen. Als ich es tatsächlich mit mehr als 100.000 Datenzeilen ausprobiert habe, hat es viel Zeit in Anspruch genommen und Speicher war erforderlich. Es scheint also, dass ein gewisser Einfallsreichtum erforderlich ist, wenn es auf große Datenmengen angewendet wird.

X.shape
(500, 754)

Es wurden bis zu 754 Merkmalsmengen extrahiert. Ich habe den Inhalt nicht im Detail bestätigt, aber es scheint, dass verschiedene Merkmale wie die Fourier-Transformation aus grundlegenden Dingen wie Mittelwert und Median berechnet werden.

Genauigkeitsüberprüfung

Versuchen wir, mithilfe der extrahierten Funktionen zu lernen und Vorhersagen zu treffen. Bereiten Sie zunächst die Lehrerdaten vor.

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

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

Es scheint, dass es keine solch extreme Variation gibt. Teilen Sie in Trainingsdaten und Testdaten.

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

Lassen Sie uns mit xgboost lernen und vorhersagen.

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

Es scheint, dass die Genauigkeit etwa 80% beträgt. Schauen wir uns auch die Bedeutung der Merkmalsmengen an.

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

Es scheint, dass Sie sehen können, welche Art von Feature-Menge aus dem Variablennamen erstellt wird. Lassen Sie uns zum Vergleich mit dem Originaldatensatz trainieren.

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

Die Genauigkeit der Originaldaten beträgt ca. 64%, sodass die von tsfresh extrahierten Daten genauer sind.

Zusammenfassung

Durch die Verwendung von tsfresh zum Extrahieren von Features aus Zeitreihendaten konnten wir die Genauigkeit verbessern. Vor der Extraktion konnte die Reihenfolge der Zeitreihendaten nicht aussagekräftig sein, daher denke ich, dass dies das Ergebnis der Sinnhaftigkeit ist. Ich habe nicht im Detail gesehen, welche Art von Daten extrahiert wurden, daher möchte ich untersuchen, um welche Art von Daten es sich handelt.

Der 7. Tag des Ateam Lifestyle Adventskalenders 2019 wird von @maonem gesendet. Ich freue mich darauf!

Die A-Team-Gruppe, die "Herausforderung" schätzt, sucht Kollegen mit einem starken Geist der Herausforderung, mit denen sie zusammenarbeiten können. Wenn Sie interessiert sind, besuchen Sie bitte die Rekrutierungsseite der A-Team Group. https://www.a-tm.co.jp/recruit/

Recommended Posts

Bibliothek tsfresh, die Features automatisch aus Zeitreihendaten extrahiert
Merkmalsmenge, die aus Zeitreihendaten extrahiert werden kann
Extrahieren Sie Perioden, die einem bestimmten Muster entsprechen, aus den qualitativen Daten der Pandas-Zeitreihen
[Python] Zeichnen Sie Zeitreihendaten
Python-Programm, das die Zeitnutzung aus icalendar-Daten aggregiert
So extrahieren Sie Funktionen von Zeitreihendaten mit PySpark Basics
[numpy] Erstellen Sie eine sich bewegende Fenstermatrix aus mehrdimensionalen Zeitreihendaten
Python: Zeitreihenanalyse: Vorverarbeitung von Zeitreihendaten
Über Zeitreihendaten und Übertraining
Differenzierung von Zeitreihendaten (diskret)
Zeitreihenanalyse 3 Vorverarbeitung von Zeitreihendaten
[Kaggle] Ich habe versucht, mithilfe von tsfresh das Feature-Quantity-Engineering mehrdimensionaler Zeitreihendaten durchzuführen
Vorhersage von Zeitreihendaten durch Simplex-Projektion
Vorhersage von Zeitreihendaten mit einem neuronalen Netzwerk
Erkennung von Zeitreihendatenanomalien für Anfänger
Umgang mit Zeitreihendaten (Implementierung)
OpenFOAM-Zeitreihendaten lesen und Daten einstellen