KI mit Python - Analysieren von Zeitreihendaten
Die Vorhersage des nächsten in einer bestimmten Eingabesequenz ist ein weiteres wichtiges Konzept beim maschinellen Lernen. Dieses Kapitel enthält eine detaillierte Erläuterung zur Analyse von Zeitreihendaten.
Einführung
Zeitreihendaten sind die Daten, die sich in einer Reihe bestimmter Zeitintervalle befinden. Wenn wir beim maschinellen Lernen eine Sequenzvorhersage erstellen möchten, müssen wir uns mit sequentiellen Daten und Zeit befassen. Seriendaten sind eine Zusammenfassung sequentieller Daten. Die Reihenfolge der Daten ist ein wichtiges Merkmal sequentieller Daten.
Grundkonzept der Sequenzanalyse oder Zeitreihenanalyse
Eine Sequenzanalyse oder Zeitreihenanalyse dient dazu, die nächste in einer gegebenen Eingabesequenz basierend auf der zuvor beobachteten vorherzusagen. Die Vorhersage kann von allem sein, was als nächstes kommen kann: ein Symbol, eine Zahl, das Wetter am nächsten Tag, der nächste Begriff in der Sprache usw. Die Sequenzanalyse kann in Anwendungen wie Börsenanalysen, Wettervorhersagen und Produktempfehlungen sehr nützlich sein.
Example
Betrachten Sie das folgende Beispiel, um die Sequenzvorhersage zu verstehen. HierA,B,C,D sind die angegebenen Werte und Sie müssen den Wert vorhersagen E Verwenden eines Sequenzvorhersagemodells.
Nützliche Pakete installieren
Für die Zeitreihendatenanalyse mit Python müssen die folgenden Pakete installiert werden:
Pandas
Pandas ist eine Open-Source-BSD-lizenzierte Bibliothek, die leistungsstarke, benutzerfreundliche Datenstruktur- und Datenanalysetools für Python bietet. Sie können Pandas mit Hilfe des folgenden Befehls installieren:
pip install pandas
Wenn Sie Anaconda verwenden und mithilfe von installieren möchten conda Paketmanager, dann können Sie den folgenden Befehl verwenden -
conda install -c anaconda pandas
hmmlearn
Es ist eine Open-Source-BSD-lizenzierte Bibliothek, die aus einfachen Algorithmen und Modellen zum Erlernen von Hidden-Markov-Modellen (HMM) in Python besteht. Sie können es mit Hilfe des folgenden Befehls installieren:
pip install hmmlearn
Wenn Sie Anaconda verwenden und mithilfe von installieren möchten conda Paketmanager, dann können Sie den folgenden Befehl verwenden -
conda install -c omnia hmmlearn
PyStruct
Es ist eine strukturierte Lern- und Vorhersagebibliothek. In PyStruct implementierte Lernalgorithmen haben Namen wie bedingte Zufallsfelder (CRF), Markov-Zufallsnetzwerke mit maximalem Rand (M3N) oder strukturelle Unterstützungsvektormaschinen. Sie können es mit Hilfe des folgenden Befehls installieren:
pip install pystruct
CVXOPT
Es wird zur konvexen Optimierung basierend auf der Programmiersprache Python verwendet. Es ist auch ein kostenloses Softwarepaket. Sie können es mit Hilfe des folgenden Befehls installieren:
pip install cvxopt
Wenn Sie Anaconda verwenden und mithilfe von installieren möchten conda Paketmanager, dann können Sie den folgenden Befehl verwenden -
conda install -c anaconda cvdoxt
Pandas: Behandeln, Schneiden und Extrahieren von Statistiken aus Zeitreihendaten
Pandas ist ein sehr nützliches Werkzeug, wenn Sie mit Zeitreihendaten arbeiten müssen. Mit Hilfe von Pandas können Sie Folgendes ausführen:
Erstellen Sie einen Datumsbereich mit der pd.date_range Paket
Index Pandas mit Datumsangaben unter Verwendung der pd.Series Paket
Führen Sie eine erneute Probenahme mit dem ts.resample Paket
Ändern Sie die Frequenz
Beispiel
Das folgende Beispiel zeigt, wie Sie die Zeitreihendaten mithilfe von Pandas verarbeiten und aufteilen. Beachten Sie, dass wir hier die monatlichen arktischen Oszillationsdaten verwenden, die von month.ao.index.b50.current.ascii heruntergeladen und für unsere Verwendung in ein Textformat konvertiert werden können.
Umgang mit Zeitreihendaten
Um Zeitreihendaten zu verarbeiten, müssen Sie die folgenden Schritte ausführen:
Der erste Schritt umfasst den Import der folgenden Pakete:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
Definieren Sie als Nächstes eine Funktion, die die Daten aus der Eingabedatei liest, wie im folgenden Code gezeigt -
def read_data(input_file):
input_data = np.loadtxt(input_file, delimiter = None)
Konvertieren Sie nun diese Daten in Zeitreihen. Erstellen Sie dazu den Datumsbereich unserer Zeitreihen. In diesem Beispiel behalten wir einen Monat als Datenhäufigkeit bei. Unsere Datei enthält die Daten, die ab Januar 1950 beginnen.
dates = pd.date_range('1950-01', periods = input_data.shape[0], freq = 'M')
In diesem Schritt erstellen wir die Zeitreihendaten mit Hilfe der Pandas-Reihe, wie unten gezeigt -
output = pd.Series(input_data[:, index], index = dates)
return output
if __name__=='__main__':
Geben Sie den Pfad der Eingabedatei wie hier gezeigt ein -
input_file = "/Users/admin/AO.txt"
Konvertieren Sie nun die Spalte in das Zeitreihenformat, wie hier gezeigt -
timeseries = read_data(input_file)
Zum Schluss zeichnen und visualisieren Sie die Daten mit den angezeigten Befehlen -
plt.figure()
timeseries.plot()
plt.show()
Sie werden die Diagramme wie in den folgenden Bildern gezeigt beobachten -
Schneiden von Zeitreihendaten
Beim Schneiden wird nur ein Teil der Zeitreihendaten abgerufen. Als Teil des Beispiels schneiden wir die Daten nur von 1980 bis 1990 auf. Beachten Sie den folgenden Code, der diese Aufgabe ausführt:
timeseries['1980':'1990'].plot()
<matplotlib.axes._subplots.AxesSubplot at 0xa0e4b00>
plt.show()
Wenn Sie den Code zum Schneiden der Zeitreihendaten ausführen, können Sie das folgende Diagramm wie in der Abbildung hier gezeigt betrachten:
Extrahieren von Statistiken aus Zeitreihendaten
Sie müssen einige Statistiken aus bestimmten Daten extrahieren, wenn Sie wichtige Schlussfolgerungen ziehen müssen. Mittelwert, Varianz, Korrelation, Maximalwert und Minimalwert sind einige dieser Statistiken. Sie können den folgenden Code verwenden, wenn Sie solche Statistiken aus bestimmten Zeitreihendaten extrahieren möchten:
Bedeuten
Du kannst den ... benutzen mean() Funktion, um den Mittelwert zu finden, wie hier gezeigt -
timeseries.mean()
Dann ist die Ausgabe, die Sie für das besprochene Beispiel beobachten werden, -
-0.11143128165238671
Maximal
Du kannst den ... benutzen max() Funktion zum Finden des Maximums, wie hier gezeigt -
timeseries.max()
Dann ist die Ausgabe, die Sie für das besprochene Beispiel beobachten werden, -
3.4952999999999999
Minimum
Sie können die Funktion min () verwenden, um das Minimum zu finden, wie hier gezeigt -
timeseries.min()
Dann ist die Ausgabe, die Sie für das besprochene Beispiel beobachten werden, -
-4.2656999999999998
Alles auf einmal bekommen
Wenn Sie alle Statistiken gleichzeitig berechnen möchten, können Sie die verwenden describe() Funktion wie hier gezeigt -
timeseries.describe()
Dann ist die Ausgabe, die Sie für das besprochene Beispiel beobachten werden, -
count 817.000000
mean -0.111431
std 1.003151
min -4.265700
25% -0.649430
50% -0.042744
75% 0.475720
max 3.495300
dtype: float64
Erneutes Abtasten
Sie können die Daten auf eine andere Zeitfrequenz neu abtasten. Die beiden Parameter für die erneute Probenahme sind -
- Zeitraum
- Method
Neuabtastung mit Mittelwert ()
Mit dem folgenden Code können Sie die Daten mit der mean () -Methode neu abtasten. Dies ist die Standardmethode.
timeseries_mm = timeseries.resample("A").mean()
timeseries_mm.plot(style = 'g--')
plt.show()
Anschließend können Sie das folgende Diagramm als Ausgabe des Resamplings mit mean () - betrachten.
Neuabtastung mit Median ()
Sie können den folgenden Code verwenden, um die Daten mithilfe von erneut abzutasten median()Methode -
timeseries_mm = timeseries.resample("A").median()
timeseries_mm.plot()
plt.show()
Anschließend können Sie das folgende Diagramm als Ausgabe der erneuten Abtastung mit median () - betrachten.
Rolling Mean
Sie können den folgenden Code verwenden, um den rollierenden (sich bewegenden) Mittelwert zu berechnen -
timeseries.rolling(window = 12, center = False).mean().plot(style = '-g')
plt.show()
Dann können Sie das folgende Diagramm als Ausgabe des rollenden (sich bewegenden) Mittelwerts betrachten -
Analyse sequentieller Daten mit dem Hidden Markov Model (HMM)
HMM ist ein statistisches Modell, das häufig für Daten mit Fortsetzung und Erweiterbarkeit verwendet wird, z. B. Zeitreihen-Aktienmarktanalyse, Gesundheitsprüfung und Spracherkennung. Dieser Abschnitt befasst sich ausführlich mit der Analyse sequentieller Daten mit dem Hidden Markov Model (HMM).
Verstecktes Markov-Modell (HMM)
HMM ist ein stochastisches Modell, das auf dem Konzept der Markov-Kette basiert und auf der Annahme basiert, dass die Wahrscheinlichkeit zukünftiger Statistiken nur vom aktuellen Prozesszustand abhängt, sondern von jedem Zustand, der ihm vorausging. Wenn wir zum Beispiel eine Münze werfen, können wir nicht sagen, dass das Ergebnis des fünften Wurfs ein Kopf ist. Dies liegt daran, dass eine Münze keinen Speicher hat und das nächste Ergebnis nicht vom vorherigen Ergebnis abhängt.
Mathematisch besteht HMM aus den folgenden Variablen:
Staaten (S)
Es ist eine Reihe von versteckten oder latenten Zuständen, die in einem HMM vorhanden sind. Es wird mit S. bezeichnet.
Ausgabesymbole (O)
Es ist ein Satz möglicher Ausgabesymbole, die in einem HMM vorhanden sind. Es wird mit O bezeichnet.
Zustandsübergangswahrscheinlichkeitsmatrix (A)
Es ist die Wahrscheinlichkeit, von einem Zustand in einen der anderen Zustände überzugehen. Es wird mit A bezeichnet.
Beobachtungsemissionswahrscheinlichkeitsmatrix (B)
Es ist die Wahrscheinlichkeit, ein Symbol in einem bestimmten Zustand zu emittieren / zu beobachten. Es wird mit B bezeichnet.
Vorherige Wahrscheinlichkeitsmatrix (Π)
Es ist die Wahrscheinlichkeit, von verschiedenen Zuständen des Systems aus bei einem bestimmten Zustand zu beginnen. Es wird mit Π bezeichnet.
Daher kann ein HMM definiert werden als = (S,O,A,B,),
wo,
- S = {s1,s2,…,sN} ist eine Menge von N möglichen Zuständen,
- O = {o1,o2,…,oM} ist eine Menge von M möglichen Beobachtungssymbolen,
- A ist ein NN Zustandsübergangswahrscheinlichkeitsmatrix (TPM),
- B ist ein NM Beobachtungs- oder Emissionswahrscheinlichkeitsmatrix (EPM),
- π ist ein N-dimensionaler Anfangszustandswahrscheinlichkeitsverteilungsvektor.
Beispiel: Analyse von Börsendaten
In diesem Beispiel werden wir Schritt für Schritt die Daten der Börse analysieren, um eine Vorstellung davon zu bekommen, wie das HMM mit sequentiellen oder Zeitreihendaten arbeitet. Bitte beachten Sie, dass wir dieses Beispiel in Python implementieren.
Importieren Sie die erforderlichen Pakete wie unten gezeigt -
import datetime
import warnings
Verwenden Sie nun die Börsendaten aus dem matpotlib.finance Paket, wie hier gezeigt -
import numpy as np
from matplotlib import cm, pyplot as plt
from matplotlib.dates import YearLocator, MonthLocator
try:
from matplotlib.finance import quotes_historical_yahoo_och1
except ImportError:
from matplotlib.finance import (
quotes_historical_yahoo as quotes_historical_yahoo_och1)
from hmmlearn.hmm import GaussianHMM
Laden Sie die Daten von einem Start- und Enddatum, dh zwischen zwei bestimmten Daten, wie hier gezeigt -
start_date = datetime.date(1995, 10, 10)
end_date = datetime.date(2015, 4, 25)
quotes = quotes_historical_yahoo_och1('INTC', start_date, end_date)
In diesem Schritt extrahieren wir jeden Tag die Schlusszitate. Verwenden Sie dazu den folgenden Befehl:
closing_quotes = np.array([quote[2] for quote in quotes])
Jetzt werden wir das Volumen der täglich gehandelten Aktien extrahieren. Verwenden Sie dazu den folgenden Befehl:
volumes = np.array([quote[5] for quote in quotes])[1:]
Nehmen Sie hier die prozentuale Differenz der Schlusskurse unter Verwendung des unten gezeigten Codes -
diff_percentages = 100.0 * np.diff(closing_quotes) / closing_quotes[:-]
dates = np.array([quote[0] for quote in quotes], dtype = np.int)[1:]
training_data = np.column_stack([diff_percentages, volumes])
Erstellen und trainieren Sie in diesem Schritt das Gaußsche HMM. Verwenden Sie dazu den folgenden Code:
hmm = GaussianHMM(n_components = 7, covariance_type = 'diag', n_iter = 1000)
with warnings.catch_warnings():
warnings.simplefilter('ignore')
hmm.fit(training_data)
Generieren Sie nun Daten mit dem HMM-Modell mit den angezeigten Befehlen -
num_samples = 300
samples, _ = hmm.sample(num_samples)
Schließlich zeichnen und visualisieren wir in diesem Schritt den Differenzprozentsatz und das Volumen der als Ausgabe gehandelten Aktien in Form eines Diagramms.
Verwenden Sie den folgenden Code, um die prozentualen Unterschiede zu zeichnen und zu visualisieren:
plt.figure()
plt.title('Difference percentages')
plt.plot(np.arange(num_samples), samples[:, 0], c = 'black')
Verwenden Sie den folgenden Code, um das Volumen der gehandelten Aktien zu zeichnen und zu visualisieren:
plt.figure()
plt.title('Volume of shares')
plt.plot(np.arange(num_samples), samples[:, 1], c = 'black')
plt.ylim(ymin = 0)
plt.show()