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.
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.
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()
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.
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)
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.
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