Zeitreihendaten sind plötzlich schwer zu verarbeiten, nicht wahr? Darüber hinaus denke ich, dass es mit zunehmender Anzahl von Variablen immer schmerzhafter wird. "Sobald Sie die Funktionen aus den Zeitreihendaten extrahiert haben, können Sie alles andere tun!" Ich denke, es gibt viele Leute.
Dieses Mal werden wir ** tsfresh ** einführen, eine Bibliothek, die für das Feature-Quantity-Engineering mehrdimensionaler Zeitreihendaten nützlich zu sein scheint.
Ich habe auf den folgenden Artikel verwiesen.
Ich habe es über Pip installiert. Sie konnten nicht von pip installieren, ohne pip zu aktualisieren. Bitte aktualisieren Sie pip.
pip install --upgrade pip
Upgrade pip mit
pip install tsfresh
Installieren Sie tsfresh mit.
pip install pandas==0.21
Bitte ändern Sie gerne.
Hier ist die Version, die ich benutze.
Das Auffinden mehrdimensionaler Zeitreihendaten war mühsam, daher verwenden wir dieses Mal eine Pseudotransformation des Datensatzes, die von tsfresh heruntergeladen werden kann. (Wenn Sie bereits eigene Daten haben, überspringen Sie diese bitte.)
Zunächst kann ich die Prozedur mit diesen Pseudodaten erfassen, aber das Ergebnis ist überhaupt nicht interessant. Wenn Sie also über eigene Daten verfügen, empfehle ich Ihnen, diese zu verwenden.
UEA & UCR Time Series Classification Repository Es scheint viele Zeitreihendaten zu geben, die interessant zu sein scheinen ...
Laden Sie zuerst die Daten.
In[1]
import pandas as pd
import numpy as np
from tsfresh.examples.har_dataset import download_har_dataset, load_har_dataset
download_har_dataset()
df = load_har_dataset()
print(df.shape)
df.head()
Wenn Sie mit überprüfen, können Sie sehen, dass diese Daten 7352 Abtastpunkte und 128 Variablen (128 Dimensionen) enthalten.
Schneiden Sie als Nächstes nur 100 Abtastpunkte und 50 Variablen aus.
In[2]
df = df.iloc[0:100, 0:50]
print(df.shape)
df.head()
Diesmal, "Es gibt fünf Probanden, und 10 Variablen von Zeitreihendaten werden von am Körper angebrachten Sensoren erfasst, um zu klassifizieren, ob die Probanden Kinder oder Erwachsene sind." Stellen Sie sich eine solche Situation vor.
Da der Zweck dieser Zeit darin besteht, den Fluss der Merkmalsmengenentwicklung zu durchschauen, Die Entsprechung der Werte ist durcheinander. Natürlich kann es nicht durch diese Daten klassifiziert werden.
In[3]
# id:5 und 10 Variablen
#Jeweils 10 Variablen werden jeder Person (Betreff) zugeordnet.
df_s1 = df.iloc[:,0:10].copy()
df_s2 = df.iloc[:,10:20].copy()
df_s3 = df.iloc[:,20:30].copy()
df_s4 = df.iloc[:,30:40].copy()
df_s5 = df.iloc[:,40:50].copy()
#Erstellen Sie eine Spalte mit jeder einzelnen ID als Wert.
df_s1['id'] = 'sub1'
df_s2['id'] = 'sub2'
df_s3['id'] = 'sub3'
df_s4['id'] = 'sub4'
df_s5['id'] = 'sub5'
#Schreiben Sie den Variablennamen jeder Spalte neu.
columns = ['x1', 'x2', 'x3', 'x4', 'x5', 'x6', 'x7', 'x8', 'x9', 'x10', 'id']
df_s1.columns = columns
df_s2.columns = columns
df_s3.columns = columns
df_s4.columns = columns
df_s5.columns = columns
df_s1.head()
Es gibt 5 Datenrahmen wie diesen.
Gemäß den offiziellen Dokumenten hat ** extract_features () **, die Hauptfunktion in diesem Artikel, ein Argument. Das Format für die Übergabe wird angegeben. Der Datentyp ist der Pandas-Datenrahmen-Objekttyp, es gibt jedoch drei Formate.
Die oben genannten sind die drei Typen. Dieses Mal werde ich es auf dieses erste Format formatieren.
id time x y
A t1 x(A, t1) y(A, t1)
A t2 x(A, t2) y(A, t2)
A t3 x(A, t3) y(A, t3)
B t1 x(B, t1) y(B, t1)
B t2 x(B, t2) y(B, t2)
B t3 x(B, t3) y(B, t3)
Fortsetzung von früher,
In[4]
df = pd.concat([df_s1, df_s2, df_s3, df_s4, df_s5], axis=0)
print(df['id'].nunique())
df.head()
Wie, wenn verbunden,
Es wird sein. Die Anzahl der eindeutigen IDs beträgt 5, sodass sie problemlos verkettet werden können.
Sie können es jetzt an die Funktion extract_features () übergeben.
Für den vorherigen Datenrahmen
In[5]
from tsfresh import extract_features
df_features = extract_features(df, column_id='id')
df_features.head()
Wenn Sie sich bewerben
Der Funktionsbetrag wird wie folgt berechnet. Es gibt 754 dieser Funktionen für eine Variable. Ich denke, dass es ziemlich viele gibt, aber ich denke, dass es nützlich ist, wenn Sie denken, dass die Schwierigkeit des Umgangs mit Zeitreihendaten gelöst ist.
Was jede Merkmalsmenge bedeutet, ist Die Dokumentation enthält eine Übersicht über extrahierte Funktionen (https://tsfresh.readthedocs.io/en/latest/text/list_of_features.html). Es scheint, dass die Merkmalsmenge (Statistik), für die Parameter erforderlich sind, durch mehrere Parameter berechnet wird.
In der Dokumentation wird nach dem Extrahieren der Features wie oben beschrieben [Filtern der Features] (https://tsfresh.readthedocs.io/en/latest/text/feature_filtering.html) wird empfohlen. Die Funktion für diese Feature-Filterung lautet ** select_features () **. Diese Funktion verwendet einen statistischen Hypothesentest, um Merkmale auszuwählen, sodass nur Merkmale, die aufgrund dieses Merkmals wahrscheinlich einen statistisch signifikanten Unterschied aufweisen.
davor,
In[6]
from tsfresh.utilities.dataframe_functions import impute
df_features = impute(df_features)
Auf diese Weise werden die nicht behandelten Werte wie NaN und unendlich in der zuvor erhaltenen Merkmalsmenge ergänzt.
Außerdem schränkt select_features () die Features basierend auf der abhängigen Variablen y ein, sodass die Daten pseudo vorbereitet werden. Dies muss pandas.Series oder numpy.array sein, wie Sie im Quellcode sehen können (https://tsfresh.readthedocs.io/en/latest/_modules/tsfresh/feature_selection/selection.html). .. Diesmal,
In[7]
from tsfresh import select_features
X = df_features
y = [0, 0, 0, 1, 1]
y = np.array(y)
Bereiten Sie einen X-Datenrahmen mit extrahierten Features und einem entsprechend zugewiesenen numpy-Array von y vor.
Und
In[8]
X_selected = select_features(X, y)
print(X_selected.shape)
X_selected
Wenn Sie das tun
Gut.
Nichts kommt brillant heraus. Das ist richtig, denn die Daten sind angemessen ... Mit den richtigen Daten sollten Sie in der Lage sein, die Funktionsmenge gut auszuwählen. (Diejenigen, die den Funktionsbetrag aus ihren eigenen Daten auswählen konnten (oder konnten), würden sich freuen zu weinen, wenn Sie uns einen Kommentar geben könnten.)
Weil es damit endet Dieses Mal habe ich anstelle der Auswahl der Merkmalsmenge mithilfe eines statistischen Hypothesentests die Dimensionskomprimierung mit PCA versucht. Es ist so, als würde man eine Instanz namens pca erstellen, anpassen und mit dieser Instanz transformieren.
In[9]
from sklearn.decomposition import PCA
pca = PCA(n_components=4)
pca.fit(df_features)
X_PCA = pca.transform(df_features)
Wenn dies in einen Datenrahmen umgewandelt und angezeigt wird,
In[10]
X_PCA = pd.DataFrame( X_PCA )
X_PCA.head()
Es wird sein.
des Weiteren, Python: Versuchen Sie die Hauptkomponentenanalyse (PCA) mit scikit-learn Wenn Sie versuchen, den Beitragssatz / kumulierten Beitragssatz unter Bezugnahme auf zu finden
In[11]
print('Beitragssatz jeder Dimension: {0}'.format(pca.explained_variance_ratio_))
print('Kumulativer Beitragssatz: {0}'.format(sum(pca.explained_variance_ratio_)))
out[11]
Beitragssatz jeder Dimension: [0.30121012 0.28833114 0.22187195 0.1885868 ]
Kumulativer Beitragssatz: 0.9999999999999999
Es wird sein. vielleicht, Möglicherweise können die Features mit PCA komprimiert werden, anstatt die Features auszuwählen.
Obwohl es ein Machtspiel ist, scheint es, wenn Sie diese Reihe von Flows verwenden, dass Sie dem Ärger entkommen können, der für die Zeitreihe einzigartig ist.
Von dort [Kaggle] Basismodellkonstruktion, Pipeline-Verarbeitung Sie können verschiedene Dinge tun, z. B. ein Basismodell wie dieses erstellen.
Als nächstes werde ich es mit tatsächlichen mehrdimensionalen Zeitreihendaten versuchen.
Recommended Posts