Zeitreihen Features einfach generiert: Ein prakti­scher Ansatz für einfache Modelle

Share post:

Von allen Schritten der Zeitrei­hen­ana­lyse und -prognose ist die Erstel­lung von Merkmalen (Features) einer der wichtigsten. Zeitrei­hen­merk­male sind in der Lage, den Trend, die Saiso­na­lität, Lags oder rollie­rende Statis­tiken zu erfassen, die dem Modell helfen, die zeitliche Dynamik zu verstehen.
In diesem Beitrag gehen wir darauf ein, welche prakti­schen Tools und Techniken zur Generie­rung von Zeitrei­hen­merk­malen einsetzen werden können. Wir vermeiden Kompli­ka­tionen beim Deep Learning und konzen­trieren uns auf effek­tive, einfache Ansätze zur Erstel­lung von Merkmalen, die einfa­chere Modelle befähigen, robuste, erklär­bare Vorher­sagen zu liefern.

Wie Features generieren: Feature enginee­ring vs. Deep Learning Methoden?

Während Deep-Learning-Modelle automa­tisch komplexe Darstel­lungen aus rohen Zeitrei­hen­daten erlernen können und direkt mit begrenzter oder sogar ohne Merkmals­trans­for­ma­tion trainiert werden können, sind klassi­schere Modelle wie lineare Regres­sion und Entschei­dungs­bäume in hohem Maße auf gut ausge­ar­bei­tete Merkmale angewiesen. Diese Modelle sind am leistungs­fä­higsten, wenn sie mit aussa­ge­kräf­tigen Merkmalen gefüt­tert werden, die aus den Rohdaten extra­hiert werden; das Feature-Enginee­ring ist dann ein wesent­li­cher Bestand­teil für eine gute Leistung und Erklär­bar­keit des Modells.

Die gute Nachricht ist, es ist keine ausge­feilte KI nötig, um aussa­ge­kräf­tige Zeitrei­hen­merk­male zu erzeugen. Statt­dessen ermög­li­chen Tools und Biblio­theken, die sich auf deter­mi­nis­ti­sche funktio­nale Trans­for­ma­tionen konzen­trieren, diese mit sehr geringem Aufwand zu extra­hieren: effizi­ente, inter­pre­tier­bare Methoden sind ideal für einfache maschi­nelle Lernmo­delle.

Python Biblio­theken zur Generie­rung von Zeitreihen Features

Einige wenige Biblio­theken sind in der Lage, den Prozess der Extrak­tion von Merkmalen aus Zeitrei­hen­daten zu automa­ti­sieren. Zu den bekann­testen gehören Catch22, das 22 sorgfältig kuratierte Zeitrei­hen­merk­male bereit­stellt, und tsfresh, eine umfang­reiche Biblio­thek für die Extrak­tion einer breiten Palette von Zeitrei­hen­merk­malen. Diese Tools sind zwar äußerst leistungs­fähig, können aber sehr rechen­in­tensiv sein und eignen sich daher nicht so gut für sehr große Daten­sätze oder Echtzeit­an­wen­dungen, wie sie in der Indus­trie üblich sind.

In diesem Beitrag werden wir uns auf Functime konzen­trieren, eine leicht­ge­wich­tige und effizi­ente Open-Source-Biblio­thek für schnelle Feature-Generie­rung, die auf Rust basiert und nahtlos in Polars integriert ist. Functime bietet ein hervor­ra­gendes Gleich­ge­wicht zwischen Rechen­ge­schwin­dig­keit und Flexi­bi­lität und eignet sich daher ideal für Szena­rien, in denen Einfach­heit und Leistung entschei­dend sind. Es ist so optimiert, dass es die mühelose Berech­nung statis­ti­scher Merkmale, einschließ­lich Verzö­ge­rungen, über eine gewünschte Periodi­zität ermög­licht. Mit Functime können schnell die Merkmale für einfa­chere Modelle erzeugt werden, ohne die Komple­xität und den Overhead aufwän­di­gerer Tools.

UseCase: Vorher­sage der Abschal­tung einer Wasser­pumpe

In diesem Anwen­dungs­fall geht es um die Vorher­sage der Abschal­tungen einer Wasser­pumpe anhand von Zeitrei­hen­daten. Der Daten­satz besteht aus unver­ar­bei­teten Sensor­mess­werten, die in regel­mä­ßigen Zeitab­ständen von 52 Sensoren erfasst werden, zusammen mit einem Zeitstempel und einer Status­be­zeich­nung (machine_status). Jeder Sensor erfasst einen bestimmten Aspekt des Pumpen­be­triebs, z. B. Druck, Tempe­ratur oder Durch­fluss­menge.
Der Daten­satz enthält folgende Spalten:
				
					timestamp # Zeitstempel jeder Beobachtung
sensor_00 # Messwerte von Sensor 00
...
sensor_51 # Messwerte von Sensor 51
maschine_status # Betriebsstatus der Pumpe (NORMAL, WARNUNG oder ABGESCHALTET)
				
			
Die Daten für unser Beispiel stammen aus dem gleich­na­migen Use Case auf Kaggle
				
					ts_sensor_path = Path(os.path.abspath("")).parents[1] / "data" / "ts_data"/ "ts_sensor_data.csv"
ts_sensor_data = pl.read_csv(source=ts_sensor_path)
ts_sensor_data.head()

				
			

Features erstellen mit FUNCTIME

Mit Functime stellen wir uns den Heraus­for­de­rungen der Model­lie­rung: die Erzeu­gung von Zeitrei­hen­merk­male. Das Tool berech­nete statis­ti­sche Merkmale über bestimmte Zeiträume und hilft dabei, die ursprüng­li­chen Daten in eine Reihe von intui­tiven Merkmalen umzuwan­deln. Für die Zwecke dieser Präsen­ta­tion haben wir statis­ti­sche Merkmale wie das absolute Maximum und den quadra­ti­schen Mittel­wert für alle sechs Stunden der Daten jedes Sensors berechnet. Über 312 Merkmale wurden aus den Daten von 52 Sensoren in nur 73 Milli­se­kunden berechnet, was die Effizienz des Verfah­rens zur Merkmals­er­stel­lung verdeut­licht. Diese schnelle Berech­nung ermög­licht die Verar­bei­tung von Echtzeit- oder Hochfre­quenz-Sensor­da­ten­strömen ohne nennens­werten Berech­nungs­auf­wand. Die berech­neten Merkmale können direkt als Input für klassi­sche Modelle wie lineare Regres­sion, Random Forests oder Gradient Boosted Trees verwendet werden.
				
					def generate_features_for_timeseries(column_name: str) -> dict:
    ts = pl.col(column_name).ts
    return {
        f"mean_n_absolute_max_{column_name}": ts.mean_n_absolute_max(n_maxima=3),
        f"range_over_mean_{column_name}": ts.range_over_mean(),
        f"root_mean_square_{column_name}": ts.root_mean_square(),
        f"first_location_of_maximum_{column_name}": ts.first_location_of_maximum(),
        f"last_location_of_maximum_{column_name}": ts.last_location_of_maximum(),
        f"absolute_maximum_{column_name}": ts.absolute_maximum()
    }
sensor_columns = [col for col in ts_sensor_data.columns if col not in ['timestamp', 'machine_status', '']]
new_features = {
    feature_name: calculation
    for sensor_column in sensor_columns
    for feature_name, calculation in generate_features_for_timeseries(sensor_column).items()
}
timeseries_features = (
    ts_sensor_data.group_by_dynamic(
        index_column="timestamp",
        every="6h",
        group_by="machine_status",
        start_by="window"
    )
    .agg(**new_features)
)
timeseries_features.head()

				
			
Die folgende Grafik zeigt, wie gut unsere Merkmale mit unseren Zielen korre­lieren. Diese Zeitreihen Features bieten wertvolle Einblicke in das Verhalten der Sensoren und ihre Bezie­hung zum Pumpen­status (NORMAL, BROKEN oder RECOVERING). Wir können zum Beispiel feststellen, dass die Pumpe kaputt ist, wenn der quadra­ti­sche Mittel­wert von Sensor 48 nahe 0 liegt. Wir erwarten auch, dass höhere absolute Maximal­werte für die Sensoren 3, 4 und 11 die Wahrschein­lich­keit erhöhen, dass sich die Pumpe in einem NORMAL-Zustand befindet.

Modell­vor­her­sagen mit unseren Zeitrei­hen­fea­tures

Anhand der berech­neten Merkmale erstellen wir ein Vorher­sa­ge­mo­dell zur Klassi­fi­zie­rung des Betriebs­zu­stands der Wasser­pumpe.
Mit Hilfe von SelectKBest wählen wir die 30 wichtigsten Merkmale auf der Grund­lage der ANOVA F-Statistiken aus. Als Basis­mo­dell haben wir uns für einen HistGradientBoostingClassifier entschieden, der robust gegen­über unaus­ge­wo­genen Klassen ist und von Haus gute Vorher­sagen liefert. Dieser schlanke Ansatz, der auf einer leichten Merkmals­ge­ne­rie­rung beruht, zeigt, wie klassi­sche Modelle hochwer­tige Vorher­sagen liefern können, wenn sie mit ausge­reiften Zeitrei­hen­merk­malen kombi­niert werden.
Unsere Key Insights für die Modell­nut­zung und -vorher­sa­ge­be­wer­tung:
  • Die Feature-Generie­rung nutzt Rust-basierte functime– und polars-Daten­ver­ar­bei­tungs­bi­blio­theken, die es ermög­li­chen, mit großen Daten­sätzen selbst auf einem einfa­chen Notebook zu arbeiten.
  • Das Modell geht effektiv mit Klassen­un­gleich­ge­wichten um und erreicht hohe Werte in allen Katego­rien. Dies beweist die Stärke des HistGradientBoostingClassifier in Kombi­na­tion mit den gut ausge­ar­bei­teten Zeitrei­hen­merk­malen.
  • Gering­fü­gige Leistungs­ein­brüche bei der Klasse RECOVERING deuten auf mögliche Verbes­se­rungen hin, wie z. B. eine Feinab­stim­mung des Modells oder die Einbe­zie­hung zusätz­li­cher Merkmale, die auf Übergangs­zu­stände zugeschnitten sind.
				
					X = timeseries_features[timeseries_features.columns[2:]]
y = timeseries_features["machine_status"]
selector = SelectKBest(score_func=f_classif, k=30).set_output(transform="pandas")
X_selected = selector.fit_transform(X, y)

X_train, X_test, y_train, y_test = train_test_split(X_selected, y, test_size=0.3, random_state=42, stratify=y)
model = HistGradientBoostingClassifier(random_state=42, class_weight="balanced")
model.fit(X_train, y_train)
y_pred = model.predict(X_test)

report = classification_report(y_test, y_pred)
print(report)

				
			
PRECISIONrecallF1-SCOREN (Support)
BROKEN1.001.001.002
NORMAL0.991.001.00346
RECOVE­RING0.960.920.9426
accuracy0.99374
macro avg0.980.970.98374
weighted avg0.990.990.99374
Dank der optimierten Merkmals­ge­ne­rie­rung zeigt das Modell eine außer­or­dent­lich vielver­spre­chende Leistung in allen Klassen
Unsere Inter­pra­tion der Modell­per­for­mance mit den generierten Zeitrei­hen­fea­tures:
  • BROKEN: Das Modell macht perfekte Vorher­sagen mit Precision, Recall und F1-Score von 1,00, ist aber mögli­cher­weise nicht sehr zuver­lässig, da es nur zwei Beispiele gibt (Support = 2);
  • NORMAL: Das Modell ist mit 99% Präzi­sion und 100% Recall nahezu perfekt, was zeigt, dass fast alle normalen Beispiele korrekt identi­fi­ziert wurden;
  • RECOVE­RING: Es gab einen leichten Leistungs­ab­fall (F1-Score = 0,94) aufgrund einiger falsch negativer Ergeb­nisse, was darauf hindeutet, dass Verbes­se­rungen durch Feature-Enginee­ring oder Hyper­pa­ra­meter-Tuning möglich sind.

Fazit: FuncTime Paket als echte Hilfe für Zeitrei­hen­fea­tures

Das Python Paket Functime kann das Leben wirklich erleich­tern, in dem es in sekun­den­schnell die Zeitrei­hen­fea­tures erstellt. Für unser Modell zur Vorher­sage der Funktio­na­lität von Wasser­pumpen war die Perfor­mance schon wirklich vielver­spre­chend, ohne, dass wir aufwän­diges Fine Tuning betreiben mussten. Ein weiterer Vorteil von automa­ti­sierter Feature­er­stel­lung ist natür­lich auch, dass kein Feature ausver­sehen vergessen wird und das Vorgehen auch mit neuen oder erwei­terten Daten einfach wieder­holen werden kann.
Picture of Mark Willhoughby

Mark Willhoughby

Data Scien­tist

Projektanfrage

Vielen Dank für Ihr Interesse an den Leistungen von m²hycon. Wir freuen uns sehr, von Ihrem Projekt zu erfahren und legen großen Wert darauf, Sie ausführlich zu beraten.

Von Ihnen im Formular eingegebene Daten speichern und verwenden wir ausschließlich zur Bearbeitung Ihrer Anfrage. Ihre Daten werden verschlüsselt übermittelt. Wir verarbeiten Ihre personenbezogenen Daten im Einklang mit unserer Datenschutzerklärung.