🗓 Save the Date KI-Snack Week 2026 – Das KI-Event für Macher & Entscheider · 09.–13. November 2026 · München + Online Jetzt anmelden →
Tipps & Tricks

Zeitreihenanalyse: Maschinenlernmodelle mit sktime in Python erstellen

8 min Lesezeit
Zeitreihenanalyse: Maschinenlernmodelle mit sktime in Python erstellen

Die Verwendung von Zeitreihendaten erfordert spezielle Ansätze, die über die Standardmethoden hinausgehen.

„Wenn Sie mit Sensordaten, Servermetriken oder anderen zeitabhängigen Daten arbeiten, wissen Sie, dass die üblichen Pipelines von scikit-learn nicht ausreichen“,

erklärt ein Experte. Die Struktur von Zeitreihendaten, die Saisonalität, Trends und die zeitliche Reihenfolge berücksichtigt, wird von tabellarischen Modellen ignoriert.

Einführung in sktime

sktime ist eine speziell für Zeitreihen entwickelte Python-Bibliothek, die eine API im Stil von scikit-learn bietet – mit den Funktionen fit, predict und transform. Diese Bibliothek ermöglicht es, Vorhersagen, Klassifikationen, Regressionen und Clusteranalysen für Zeitreihen durchzuführen, alles mit einer einheitlichen Schnittstelle.

In diesem Artikel wird ein Beispielproblem behandelt: die Vorhersage von Temperaturmessungen eines industriellen HVAC-Sensors. Dabei wird erläutert, wie sktime mit Zeitreihendaten umgeht, wie Vorverarbeitungspipelines erstellt werden, wie Vorhersagemodelle angepasst werden und wie deren Leistung bewertet wird. Für eine tiefere Einsicht in die Automatisierung der explorativen Datenanalyse können Sie Effiziente Python-Skripte zur Automatisierung der explorativen Datenanalyse lesen.

Voraussetzungen

Für die Nutzung von sktime benötigen Sie Python 3.10 oder höher sowie grundlegende Kenntnisse in pandas. Die Installation der benötigten Pakete erfolgt mit:

pip install sktime pmdarima statsmodels

Alternativ können Sie alle optionalen Abhängigkeiten mit folgendem Befehl installieren:

pip install sktime[all_extras]

Die Nützlichkeit von sktime

Um die Vorteile von sktime zu verstehen, ist es wichtig, das Problem zu erkennen, das die Bibliothek löst. In scikit-learn wird Ihre Datenstruktur als 2D-Tabelle betrachtet – Zeilen sind Proben, Spalten sind Merkmale. Zeitreihendaten brechen diese Annahme, da jede „Zeile“ tatsächlich eine Sequenz von Werten über die Zeit darstellt, wobei die Reihenfolge dieser Werte von Bedeutung ist.

Die Hauptdatencontainer, die verwendet werden, sind:

  • Series: pd.Series oder pd.DataFrame – Eine einzelne Zeitreihe für die Vorhersage.
  • Panel: pd.DataFrame mit einem 2-stufigen MultiIndex – Eine Sammlung mehrerer unabhängiger Zeitreihen.
  • Hierarchical: pd.DataFrame mit einem 3+ stufigen MultiIndex – Ein strukturiertes Set von Zeitreihen mit Aggregationsebenen über mehrere Dimensionen.

Für den Zeitindex unterstützt sktime verschiedene Zeitindizes: DatetimeIndex, PeriodIndex, Int64Index und RangeIndex in Ihren pandas-Objekten. Der Index muss monoton sein, und bei Verwendung von DatetimeIndex sollte das Attribut freq gesetzt werden.

Erstellung des Datensatzes

Um einen realistischen Datensatz zu erstellen, stellen Sie sich einen HVAC-Sensor in einer Fabrik vor, der stündlich die Temperatur aufzeichnet. Die Messwerte weisen ein tägliches saisonales Muster auf (höher während der Arbeitszeiten), einen leichten Aufwärtstrend aufgrund des Sommers und etwas Rauschen.

import numpy as np
import pandas as pd
np.random.seed(42)
# 90 Tage stündlicher Messungen ab dem 1. Januar 2026
n_hours = 90 * 24
timestamps = pd.date_range(start="2026-01-01", periods=n_hours, freq="h")
# Trend: allmählicher Anstieg um 5 Grad über 90 Tage
trend = np.linspace(0, 5, n_hours)
# Tägliche Saisonalität: Temperatur erreicht um 14 Uhr ihren Höhepunkt, sinkt um 4 Uhr
hour_of_day = np.arange(n_hours) % 24
daily_cycle = 4 * np.sin(2 * np.pi * (hour_of_day - 4) / 24)
# Rauschen
noise = np.random.normal(0, 0.8, n_hours)
# Basis-Temperatur um 20°C
temperature = 20 + trend + daily_cycle + noise
# Einführung einiger fehlender Werte (Sensorabbruch)
dropout_indices = [300, 301, 302, 1440, 1441]
temperature[dropout_indices] = np.nan
y = pd.Series(temperature, index=timestamps, name="temp_celsius")
y.index.freq = pd.tseries.frequencies.to_offset("h")
print(y.head())
print(f"\nShape: {y.shape}")
print(f"Missing values: {y.isna().sum()}")
print(f"Index type: {type(y.index)}")

Die Ausgabe zeigt die ersten fünf Werte der Zeitreihe sowie die Gesamtzahl der Messungen und die Anzahl der fehlenden Werte.

Aufteilung der Zeitreihendaten für Training und Test

Die Aufteilung von Zeitreihendaten unterscheidet sich von der von tabellarischen Daten – Zeilen können nicht zufällig gemischt werden. Die Aufteilung muss immer chronologisch erfolgen: Trainieren Sie mit früheren Daten und testen Sie mit späteren Daten.

sktime bietet dafür die Funktion temporal_train_test_split:

from sktime.split import temporal_train_test_split
# Letzte 7 Tage (168 Stunden) als Testset zurückhalten
y_train, y_test = temporal_train_test_split(y, test_size=168)
print(f"Train: {y_train.index[0]} → {y_train.index[-1]}")
print(f"Test: {y_test.index[0]} → {y_test.index[-1]}")
print(f"Train size: {len(y_train)}, Test size: {len(y_test)}")

Die Funktion stellt sicher, dass die Aufteilung sauber und chronologisch erfolgt – keine Datenlecks aus der Zukunft in das Trainingsset.

Definition des Vorhersagehorizonts

Bevor ein Modell angepasst wird, muss sktime mitgeteilt werden, welche Zeitpunkte vorhergesagt werden sollen. Dies geschieht über den ForecastingHorizon.

from sktime.forecasting.base import ForecastingHorizon
# 168 Schritte (7 Tage stündlicher Daten) vorhersagen
# is_relative=False bedeutet, dass absolute Zeitstempel verwendet werden
fh = ForecastingHorizon(y_test.index, is_relative=False)
print(f"Horizon length: {len(fh)}")
print(f"First forecast point: {fh[0]}")
print(f"Last forecast point: {fh[-1]}")

Die Ausgabe zeigt die Länge des Vorhersagehorizonts sowie die ersten und letzten Vorhersagezeitpunkte.

Aufbau einer Vorverarbeitungs- und Vorhersagepipeline

Echte Sensordaten weisen fehlende Werte, saisonale Muster und Trends auf – all dies muss vor oder während der Vorhersage behandelt werden. Der TransformedTargetForecaster von sktime ermöglicht es, Transformationen mit einem Vorhersagemodell zu verknüpfen und in einem einzigen Schätzer zu kombinieren.

from sktime.forecasting.exp_smoothing import ExponentialSmoothing
from sktime.forecasting.compose import TransformedTargetForecaster
from sktime.transformations.series.impute import Imputer
from sktime.transformations.series.detrend import Deseasonalizer, Detrender
pipeline = TransformedTargetForecaster(
 steps=[
 # Schritt 1: Fehlende Sensorwerte mit linearer Interpolation auffüllen
 ("imputer", Imputer(method="linear")),
 # Schritt 2: Den linearen Trend entfernen, damit der Vorhersager eine stationäre Reihe sieht
 ("detrender", Detrender()),
 # Schritt 3: Die tägliche Saisonalität entfernen (sp=24 für stündliche Daten mit 24-Stunden-Zyklen)
 ("deseasonalizer", Deseasonalizer(model="additive", sp=24)),
 # Schritt 4: Die bereinigten, stationären Residuen vorhersagen
 ("forecaster", ExponentialSmoothing(trend=None, seasonal=None)),
 ]
)
pipeline.fit(y_train, fh=fh)
y_pred = pipeline.predict()
print(y_pred.head())

Jeder Schritt hat eine spezifische Funktion, um die Daten für die Vorhersage vorzubereiten. Wenn Sie mehr über effektive Skripte zur Generierung synthetischer Daten erfahren möchten, schauen Sie sich Fünf effektive Python-Skripte zur Generierung synthetischer Daten an.

Bewertung der Vorhersage

sktime integriert sich mit gängigen Bewertungsmetriken. Für Vorhersagen sind der mittlere absolute Fehler (MAE) und der mittlere absolute prozentuale Fehler (MAPE) gängige Optionen.

from sktime.performance_metrics.forecasting import (
 mean_absolute_error,
 mean_absolute_percentage_error,
)
mae = mean_absolute_error(y_test, y_pred)
mape = mean_absolute_percentage_error(y_test, y_pred)
print(f"MAE: {mae:.3f} °C")
print(f"MAPE: {mape*100:.2f}%")

Die Ausgabe zeigt die Werte für MAE und MAPE, die die Genauigkeit der Vorhersagen quantifizieren.

Wechsel zu einem anderen Vorhersagemodell

Ein wesentlicher Vorteil der sktime-Schnittstelle ist, dass der Austausch des zugrunde liegenden Algorithmus nur eine Zeile erfordert. Ein ARIMA-Modell kann anstelle der exponentiellen Glättung verwendet werden, um die Ergebnisse zu vergleichen.

from sktime.forecasting.arima import ARIMA
pipeline_arima = TransformedTargetForecaster(
 steps=[
 ("imputer", Imputer(method="linear")),
 ("detrender", Detrender()),
 ("deseasonalizer", Deseasonalizer(model="additive", sp=24)),
 # ARIMA(1,1,1) auf den bereinigten Residuen
 ("forecaster", ARIMA(order=(1, 1, 1), suppress_warnings=True)),
 ]
)
pipeline_arima.fit(y_train, fh=fh)
y_pred_arima = pipeline_arima.predict()
mae_arima = mean_absolute_error(y_test, y_pred_arima)
mape_arima = mean_absolute_percentage_error(y_test, y_pred_arima)
print(f"ARIMA MAE: {mae_arima:.3f} °C")
print(f"ARIMA MAPE: {mape_arima*100:.2f}%")

Der entscheidende Punkt ist, dass die Schritte zur Vorverarbeitung – Imputation, Detrendierung, Deseasonalisierung – identisch blieben. Nur der finale Vorhersager wurde geändert, und alles andere fügte sich nahtlos zusammen.

Kreuzvalidierung über Zeit

Die Beibehaltung eines einzelnen Testfensters kann irreführend sein. sktime bietet Zeitreihen-Kreuzvalidierung durch Splitter, die die zeitliche Reihenfolge respektieren.

from sktime.split import ExpandingWindowSplitter
from sktime.forecasting.model_evaluation import evaluate
# Expanding window: Beginnen Sie mit einem 1800-Stunden-Trainingsset, bewerten Sie auf 168-Stunden-Fenstern
cv = ExpandingWindowSplitter(
 initial_window=1800,
 fh=list(range(1, 169)),
 step_length=168,
)
results = evaluate(
 forecaster=pipeline,
 y=y,
 cv=cv,
 scoring=mean_absolute_error,
 return_data=False,
)
print(results[["test__DynamicForecastingErrorMetric", "fit_time"]].round(3))
print(f"\nMean CV MAE: {results['test__DynamicForecastingErrorMetric'].mean():.3f} °C")

Die Funktion evaluate gibt ein DataFrame mit Metriken und Zeitangaben zurück. Der Kreuzvalidierungs-MAE bestätigt, dass das Modell konsistent über verschiedene Zeitfenster in den Daten generalisiert.

Nächste Schritte

Dieser Artikel behandelte den grundlegenden Vorhersageworkflow in sktime, doch die Bibliothek bietet weit mehr als nur grundlegende Vorhersageaufgaben. Sie unterstützt auch die Klassifikation von Zeitreihen, probabilistische Vorhersagen mit Unsicherheitsabschätzungen, das Training gemeinsamer Modelle über mehrere verwandte Zeitreihen und die Anpassung traditioneller Machine-Learning-Algorithmen für sequentielle Vorhersagen. Für Einsteiger in die Datenwissenschaft könnte Der umfassende Leitfaden für Einsteiger in die Datenwissenschaft 2026: Wichtige Skills und Fallstricke hilfreich sein.

Eine der größten Stärken von sktime ist die konsistente API und die Integration in das breitere Python-Maschinenlern-Ökosystem, was das Experimentieren sowohl für Anfänger als auch für erfahrene Praktiker erleichtert. Die Dokumentation und Beispielnotebooks von sktime sind besonders gut geschrieben und sollten als Lesezeichen gespeichert werden, wenn Sie regelmäßig mit Vorhersage- oder zeitabhängigen Datenproblemen arbeiten.

Bala Priya C ist Entwicklerin und technische Autorin aus Indien. Sie arbeitet an der Schnittstelle von Mathematik, Programmierung, Datenwissenschaft und Content-Erstellung. Ihre Interessensgebiete und Fachkenntnisse umfassen DevOps, Datenwissenschaft und natürliche Sprachverarbeitung. Sie genießt das Lesen, Schreiben, Programmieren und Kaffee!

„`


Quellen: kdnuggets

Bildquelle: KI generiert

🚀
KI-Snack Week 2026 · 09.–13. November
Das KI-Event für Macher & Entscheider
2 Tage live in München + 3 Tage Online-Masterclasses · Jetzt Ticket sichern
Mehr erfahren →
KI Snack