Zeitreihen und insbesondere die Prognose von Zeitreihen sind sowohl unter Fachleuten als auch unter Geschäftsanwendern ein sehr bekanntes Drawback der Datenwissenschaft.

Es gibt verschiedene Prognosemethoden, die zum besseren Verständnis und einer besseren Übersicht in die Kategorien Statistik und maschinelles Lernen eingeteilt werden können. Tatsächlich ist der Bedarf an Prognosen jedoch so hoch, dass es eine Fülle von Optionen gibt.

Methoden des maschinellen Lernens gelten als moderne Methode zur Zeitreihenprognose und erfreuen sich zunehmender Beliebtheit, da sie in der Lage sind, komplexe nichtlineare Zusammenhänge in den Daten zu erfassen und im Allgemeinen zu höheren Prognosegenauigkeiten zu führen (1). Ein beliebtes Feld des maschinellen Lernens ist der Bereich der neuronalen Netze. Speziell für die Zeitreihenanalyse wurden rekurrierende neuronale Netze entwickelt und zur Lösung von Prognoseproblemen eingesetzt (2).

Knowledge Science-Enthusiasten finden die Komplexität solcher Modelle möglicherweise einschüchternd, und da ich einer von Ihnen bin, kann ich sagen, dass ich dieses Gefühl teile. Dieser Artikel soll jedoch zeigen, dass

Trotz der neuesten Entwicklungen bei Methoden des maschinellen Lernens lohnt es sich nicht unbedingt, bei der Suche nach einer Lösung für ein bestimmtes Drawback die komplexeste Anwendung zu verfolgen. Bewährte Methoden, die mit leistungsstarken Techniken des Function Engineering erweitert wurden, könnten immer noch zufriedenstellende Ergebnisse liefern.

Genauer gesagt wende ich ein mehrschichtiges Perzeptron-Modell an und gebe den Code und die Ergebnisse weiter, sodass Sie praktische Erfahrungen in der Entwicklung von Zeitreihenfunktionen und der effektiven Prognose sammeln können.

Genauer gesagt kann ich meine Ziele, die ich anderen autodidaktischen Berufskollegen vermitteln möchte, in den folgenden Punkten zusammenfassen:

  1. Prognosen basierend auf realen Problemen/Daten
  2. So entwickeln Sie Zeitreihenfunktionen zur Erfassung zeitlicher Muster
  3. Erstellen Sie ein MLP-Modell, das gemischte Variablen verwenden kann: Gleitkommazahlen und Ganzzahlen (die durch Einbettung als kategorisch behandelt werden).
  4. Verwenden Sie MLP zur Punktprognose
  5. Verwenden Sie MLP für mehrstufige Prognosen
  6. Bewerten Sie die Merkmalswichtigkeit mithilfe der Permutationsmethode für Merkmalswichtigkeit
  7. Modell für eine Teilmenge gruppierter Merkmale (mehrere Gruppen, trainiert für einzelne Gruppen) neu trainieren, um die Merkmalswichtigkeit gruppierter Merkmale zu verfeinern
  8. Bewerten Sie das Modell durch Vergleich mit einem UnobservedComponents Modell

Bitte beachten Sie, dass dieser Artikel die Kenntnis einiger wichtiger Fachbegriffe voraussetzt und nicht beabsichtigt, diese im Element zu erklären. Nachfolgend finden Sie die wichtigsten Begriffe mit den angegebenen Referenzen, die Sie auf ihre Klarheit hin überprüfen können:

  1. Zeitfolgen (3)
  2. Vorhersage (4) — in diesem Zusammenhang wird es verwendet, um Modellergebnisse in der Trainingsphase zu unterscheiden
  3. Vorhersage (4) — in diesem Zusammenhang wird es verwendet, um die Modellergebnisse im Testzeitraum zu unterscheiden
  4. Funktionsentwicklung (5)
  5. Autokorrelation (6)
  6. Partielle Autokorrelation (6)
  7. MLP (Mehrschichtiges Perzeptron) (7)
  8. Eingabeebene (7)
  9. Versteckte Ebene (7)
  10. Ausgabeebene (7)
  11. Einbettung (8)
  12. Zustandsraummodelle (9)
  13. Modell der unbeobachteten Komponenten (9)
  14. RMSE (mittlerer quadratischer Fehler) (10)
  15. Wichtigkeit der Funktion (11)
  16. Bedeutung der Permutationsfunktion (11)

Die wesentlichen Pakete, die während der Analyse verwendet werden, sind numpy Und pandas zur Datenmanipulation, plotly für interaktive Diagramme, statsmodels für Statistik und Zustandsraummodellierung und schließlich tensorflow für MLP-Architektur.

Hinweis: Aufgrund technischer Einschränkungen werde ich die Codeausschnitte für interaktives Plotten bereitstellen, die Abbildungen werden hier jedoch statisch dargestellt.

import opendatasets as od
import numpy as np
import pandas as pd
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import tensorflow as tf

from sklearn.preprocessing import StandardScaler
from sklearn.inspection import permutation_importance
import statsmodels.api as sm
from statsmodels.tsa.stattools import acf, pacf
import datetime

import warnings
warnings.filterwarnings('ignore')

Das Laden der Daten erfolgt automatisch über opendatasets.

dataset_url = "https://www.kaggle.com/datasets/robikscube/hourly-energy-consumption/"
od.obtain(dataset_url)
df = pd.read_csv(".hourly-energy-consumption" + "AEP_hourly.csv", index_col=0)
df.sort_index(inplace = True)

Bedenken Sie, dass die Datenbereinigung ein wesentlicher erster Schritt struggle, um mit der Analyse fortzufahren. Wenn Sie an den Particulars und auch an der Zustandsraummodellierung interessiert sind, lesen Sie bitte meinen vorherigen Artikel Hier. ☚📰 Kurz gesagt wurden die folgenden Schritte durchgeführt:

  1. Identifizieren von Lücken, wenn bestimmte Zeitstempel fehlen (es wurden nur einzelne Schritte identifiziert)
  2. Imputation durchführen (mit dem Mittelwert der vorherigen und nächsten Datensätze)
  3. Identifizieren und Löschen von Duplikaten
  4. Legen Sie die Zeitstempelspalte als Index für den Datenrahmen fest
  5. Stellen Sie die Dataframe-Indexfrequenz auf stündlich ein, da dies eine Voraussetzung für die weitere Verarbeitung ist.

Nachdem wir die Daten vorbereitet haben, untersuchen wir sie, indem wir fünf zufällige Zeitstempelstichproben ziehen und die Zeitreihen auf verschiedenen Skalen vergleichen.

fig = make_subplots(rows=5, cols=4, shared_yaxes=True, horizontal_spacing=0.01, vertical_spacing=0.04)

# drawing a random pattern of 5 indices with out repetition
pattern = sorted((x for x in np.random.alternative(vary(0, len(df), 1), 5, change=False)))

# zoom x scales for plotting
intervals = (9000, 3000, 720, 240)

colours = ("#E56399", "#F0B67F", "#DE6E4B", "#7FD1B9", "#7A6563")

# s for pattern datetime begin
for si, s in enumerate(pattern):

# p for interval size
for pi, p in enumerate(intervals):
cdf = df.iloc(s:(s+p+1),:).copy()
fig.add_trace(go.Scatter(x=cdf.index,
y=cdf.AEP_MW.values,
marker=dict(coloration=colours(si))),
row=si+1, col=pi+1)

fig.update_layout(
font=dict(household="Arial"),
margin=dict(b=8, l=8, r=8, t=8),
showlegend=False,
top=1000,
paper_bgcolor="#FFFFFF",
plot_bgcolor="#FFFFFF")
fig.update_xaxes(griddash="dot", gridcolor="#808080")
fig.update_yaxes(griddash="dot", gridcolor="#808080")

Von admin

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert