Trainingsplateaus mit Zeitreihenprognose in Python erkennen
Gehen Sie über einfaches Logging hinaus: Nutzen Sie Python, Pandas und Prophet, um Kraftzuwächse vorherzusagen und Plateaus früh zu erkennen.
Auf dieser Seite
Wir alle kennen das. Sie trainieren regelmäßig im Fitnessstudio, legen mehr Gewicht auf die Stange und fühlen sich von Woche zu Woche stärker. Dann kommt Ihr Fortschritt plötzlich zum Stillstand. Die Gewichte, die sich zuvor beherrschbar anfühlten, fühlen sich nun unerträglich schwer an, und Sie bleiben wochenlang bei denselben Zahlen hängen. Diese frustrierende Erfahrung wird als Trainingsplateau bezeichnet und ist eine häufige Hürde für Kraftsportler aller Erfahrungsstufen.
Was aber, wenn Sie ein Plateau erkennen könnten, bevor es eintritt? In diesem ausführlichen Tutorial erfahren Sie, wie Sie mit Zeitreihenprognosen in Python Ihre künftigen Kraftzuwächse vorhersagen und – noch wichtiger – erkennen, wann Sie voraussichtlich auf ein Plateau treffen. Am Ende verfügen Sie über einen praktischen, datengestützten Ansatz, um Ihren Trainingsfortschritt zu verstehen.
Wir erstellen ein Modell, um unser Ein-Wiederholungs-Maximum (1RM) beim Bankdrücken vorherzusagen, und analysieren die Prognose, um den Zeitpunkt zu bestimmen, an dem unsere Zuwächse voraussichtlich abflachen. So können Sie proaktiv Änderungen an Ihrem Trainingsprogramm vornehmen – etwa Volumen oder Intensität anpassen oder eine dringend nötige Entlastungswoche einlegen.
Für Entwickler ist das relevant, weil es eine hervorragende, praxisnahe Anwendung von Prinzipien der Datenwissenschaft ist. Sie arbeiten mit greifbaren Daten, die Sie selbst erzeugen können, und sehen die direkte Wirkung Ihres Codes auf Ihre persönlichen Fitnessziele.
Voraussetzungen:
- Grundlegendes Verständnis von Python und der Bibliothek pandas.
- Vertrautheit mit grundlegenden Konzepten des maschinellen Lernens.
- Python (3.6+) mit Jupyter Notebook oder Ihrer bevorzugten IDE.
- Die folgenden installierten Bibliotheken:
pandas,numpy,plotlyundprophet.
Das Problem verstehen
Ein Trainingsplateau ist in Datentermen ein Zeitraum, in dem die Fortschrittsrate (die Steigung Ihrer Kraftkurve) gegen null geht. Ein Plateau lässt sich oft „spüren“, doch ein strengerer Ansatz besteht darin, den Fortschritt im Zeitverlauf zu modellieren und vorherzusagen, wann die Leistung voraussichtlich stagniert.
Herkömmliche Methoden, Workouts in Notizbüchern oder Tabellen zu erfassen, eignen sich gut, um festzuhalten, was Sie getan haben – sie sind jedoch rückblickend. Zeitreihenprognosen erlauben uns, vorausschauend zu sein: anhand der Muster der Vergangenheit in die Zukunft zu blicken.
Wir verwenden eine verbreitete Bibliothek für Zeitreihenprognosen namens Prophet, entwickelt vom Core-Data-Science-Team von Facebook. Prophet eignet sich gut für diese Aufgabe, weil es robust gegenüber fehlenden Daten ist (wir alle lassen hin und wieder einen Trainingstag aus), Trends und Saisonalität gut abbildet und auch für Einsteiger in die Prognostik vergleichsweise einfach zu nutzen ist.
Voraussetzungen
Bevor wir beginnen, richten wir unsere Umgebung ein. Sie müssen die erforderlichen Python-Bibliotheken installieren.
pip install pandas numpy prophet plotly
- pandas & numpy: Für Datenverarbeitung und numerische Operationen.
- prophet: Die Prognosebibliothek, die wir verwenden.
- plotly: Zum Erstellen interaktiver Visualisierungen.
Schritt 1: Einen synthetischen Trainingsdatensatz erzeugen
Echte Trainingsprotokolle können unübersichtlich sein. Für dieses Tutorial erstellen wir einen sauberen, synthetischen Datensatz, der den Weg eines Kraftsportlers abbildet: eine Phase stetigen Fortschritts, gefolgt von einem Plateau. So lässt sich unser Modell leichter in Aktion sehen.
Was wir tun
Wir erstellen einen pandas-DataFrame mit zwei Spalten: ds (das Datum des Trainings) und y (die Kennzahl, die wir verfolgen). In diesem Beispiel ist y das geschätzte Ein-Wiederholungs-Maximum (1RM) beim Bankdrücken. Das 1RM ist eine gute Kennzahl zur Kraftmessung, weil es ein konsistentes Maß für den Fortschritt liefert, auch wenn sich Ihre Wiederholungsbereiche ändern. Zur Schätzung verwenden wir die gängige Epley-Formel: 1RM = weight * (1 + reps / 30).
Umsetzung
Schreiben wir ein Python-Skript, um diese Daten zu erzeugen. Wir simulieren einen Kraftsportler, der mehrere Monate lang dreimal pro Woche trainiert.
# src/data_generation.py
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
def generate_workout_data():
"""
Generates a synthetic workout dataset simulating progress and a plateau.
"""
start_date = datetime(2024, 1, 1)
# Simulate 9 months of training, 3 times a week
dates = pd.to_datetime([start_date + timedelta(days=i*2.33) for i in range(108)])
# Initial strength
initial_1rm = 135 # lbs
# Phase 1: Newbie gains (first 4 months) - rapid, consistent progress
newbie_gains_period = int(108 * 0.45)
newbie_gains = np.linspace(0, 55, newbie_gains_period)
# Phase 2: Intermediate gains (next 3 months) - slower progress
intermediate_period = int(108 * 0.30)
intermediate_gains = np.linspace(5, 15, intermediate_period)
# Phase 3: Plateau (last months) - minimal gains
plateau_period = int(108 * 0.25)
plateau_gains = np.random.uniform(0, 1.5, plateau_period)
# Combine gains and add some noise
total_gains = np.concatenate([newbie_gains, intermediate_gains, plateau_gains])
noise = np.random.normal(0, 2, len(dates))
# Calculate estimated 1RM over time
estimated_1rm = initial_1rm + total_gains + noise
df = pd.DataFrame({'ds': dates, 'y': estimated_1rm})
df['y'] = df['y'].round(1)
return df
workout_df = generate_workout_data()
print(workout_df.head())
print("\
--- Last 5 entries ---")
print(workout_df.tail())
So funktioniert es
Dieses Skript erzeugt eine Zeitachse von Trainingseinheiten und simuliert drei unterschiedliche Phasen im Werdegang eines Kraftsportlers:
- Anfängerzuwächse: Eine Phase raschen und linearen Kraftanstiegs.
- Fortgeschrittenenzuwächse: Der Fortschritt verlangsamt sich, je erfahrener der Kraftsportler wird.
- Plateau: Die Kraftzuwächse werden minimal und schwanken.
Wir fügen etwas zufälliges Rauschen hinzu, damit die Daten realistischer wirken. „Gute“ und „schlechte“ Tage im Fitnessstudio gehören zur Realität!
Erwartete Ausgabe
ds y
0 2024-01-01 00:00:00 133.5
1 2024-01-03 07:55:12 136.9
2 2024-01-05 15:50:24 138.8
3 2024-01-07 23:45:36 139.7
4 2024-01-10 07:40:48 141.4
--- Last 5 entries ---
ds y
103 2024-09-02 15:50:24 206.5
104 2024-09-04 23:45:36 205.8
105 2024-09-07 07:40:48 207.2
106 2024-09-09 15:36:00 206.0
107 2024-09-12 00:00:00 206.8
Schritt 2: Die historischen Daten visualisieren
Bevor wir mit der Prognose beginnen, ist es entscheidend, unsere Daten zu visualisieren, um ihre Muster zu verstehen.
Umsetzung
# src/visualization.py
import plotly.express as px
def plot_historical_data(df):
fig = px.line(df, x='ds', y='y', title='Bench Press 1RM Progression Over Time',
labels={'ds': 'Date', 'y': 'Estimated 1RM (lbs)'})
fig.update_layout(template="plotly_white")
fig.show()
plot_historical_data(workout_df)
So funktioniert es
Damit erzeugen Sie ein interaktives Diagramm, das den Fortschritt unseres simulierten Kraftsportlers zeigt. Sie erkennen deutlich die anfangs steile Kurve, die Abflachung und schließlich das Plateau.
(Ein Beispielbild davon, wie das Diagramm aussehen würde)
Schritt 3: Das Prognosemodell erstellen und trainieren
Nun kommt der spannende Teil! Wir verwenden Prophet, um eine Prognose zu erstellen. Prophet verlangt ein bestimmtes Datenformat: Die Datumsspalte muss ds und die Wertespalte y heißen – das haben wir bereits so angelegt.
Was wir tun
Wir instanziieren ein Prophet-Modell, passen es an unsere historischen Daten an und erstellen anschließend einen „Zukunfts“-DataFrame für unsere Vorhersagen.
Umsetzung
# src/forecasting.py
from prophet import Prophet
# Initialize the model
# changepoint_prior_scale helps adjust the flexibility of the trend.
# A higher value makes the trend more flexible.
model = Prophet(changepoint_prior_scale=0.5, yearly_seasonality=False, weekly_seasonality=True, daily_seasonality=False)
# Fit the model to our data
model.fit(workout_df)
# Create a dataframe for future predictions (e.g., the next 3 months)
future = model.make_future_dataframe(periods=90)
# Generate the forecast
forecast = model.predict(future)
# Display the last few rows of the forecast
print(forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail())
So funktioniert es
Prophet(...): Wir erzeugen eine Instanz des Prophet-Modells. Die wöchentliche Saisonalität haben wir aktiviert, weil Trainingspläne oft einem Wochenmuster folgen. Wir habenchangepoint_prior_scaleerhöht, damit das Modell den Trendwechsel vom raschen Wachstum zum Plateau besser erfassen kann.model.fit(workout_df): Hier lernt das Modell die Muster aus unseren historischen Daten.make_future_dataframe(periods=90): Prophet erstellt einen DataFrame, der 90 Tage in die Zukunft reicht.model.predict(future): Damit wird der Zukunfts-DataFrame mit Vorhersagen (yhat) und Unsicherheitsintervallen (yhat_lower,yhat_upper) gefüllt.
Erwartete Ausgabe
ds yhat yhat_lower yhat_upper
202 2024-12-07 19:12:00 210.034785 205.860111 214.364426
203 2024-12-08 19:12:00 209.689408 205.158756 213.784411
204 2024-12-09 19:12:00 209.914285 205.479532 214.072972
205 2024-12-10 19:12:00 210.158564 205.795817 214.394158
206 2024-12-11 19:12:00 210.228532 205.908851 214.469447
Schritt 4: Die Prognose analysieren, um ein Plateau vorherzusagen
Eine Prognose ist hilfreich, aber unser Ziel ist es, ein Plateau zu erkennen. Ein Plateau tritt ein, wenn die Änderungsrate unseres Fortschritts gegen null geht. Prophet liefert in seiner Prognose praktischerweise eine trend-Komponente, die wir analysieren können.
Was wir tun
Wir visualisieren die Prognose und ihre Komponenten. Anschließend berechnen wir die tägliche Änderungsrate des prognostizierten Trends, um quantitativ zu bestimmen, wann unser Fortschritt stagniert.
Umsetzung
# src/analysis.py
from prophet.plot import plot_plotly
# Plot the forecast
fig1 = model.plot(forecast)
# Use plot_plotly for an interactive version
# fig1_interactive = plot_plotly(model, forecast)
# Plot the forecast components (trend and seasonality)
fig2 = model.plot_components(forecast)
# --- Plateau Detection ---
# Calculate the daily change in the trend
forecast['trend_change'] = forecast['trend'].diff()
# Identify the date when the trend change becomes negligible (e.g., < 0.1 lbs per day)
plateau_start_date = forecast[forecast['trend_change'] < 0.1].iloc[0]['ds']
print(f"A potential plateau is predicted to start around: {plateau_start_date.date()}")
# Add a marker to the forecast plot for the plateau
import matplotlib.pyplot as plt
# Get the figure and axes from the plot
ax = fig1.gca()
# Add a vertical line to signify the start of the plateau
ax.axvline(plateau_start_date, color='r', linestyle='--', lw=2)
ax.text(plateau_start_date, workout_df['y'].min(), ' Plateau Predicted', color='r')
plt.show() # Display the plot with the plateau line
So funktioniert es
Die plot-Funktionen von Prophet machen es einfach, die Prognose zu visualisieren. Die schwarzen Punkte stehen für unsere tatsächlichen Daten, die dunkelblaue Linie ist die Vorhersage (yhat), und der hellblaue Bereich ist das Unsicherheitsintervall.
Der Schlüssel zu unserer Plateau-Erkennung ist die Berechnung von forecast['trend'].diff(). Damit erhalten wir die tägliche Veränderung unseres zugrunde liegenden Krafttrends. Anschließend suchen wir das erste Datum, an dem diese Veränderung unter einen kleinen Schwellenwert fällt (hier 0,1 lbs). Das ist der vorhergesagte Beginn des Plateaus. Wenn wir dies als senkrechte Linie in unser Prognosediagramm einzeichnen, erhalten wir einen aussagekräftigen visuellen Hinweis darauf, wann wir etwas ändern sollten.
Alles zusammenführen
Betrachten wir das Gesamtbild: die historischen Daten, die Prognose und unseren vorhergesagten Plateau-Punkt in einem Diagramm. Die rot gestrichelte Linie im Diagramm zeigt genau, wann unser Modell vorhersagt, dass die Zuwächse enden.
(Ein Beispielbild davon, wie das Prognosediagramm mit der roten Plateau-Linie aussehen würde)
Diese Visualisierung ist außerordentlich aussagekräftig. Sie sehen Ihren bisherigen Fortschritt und eine statistisch gestützte Vorhersage Ihres künftigen Fortschritts, einschließlich des Stagnationspunkts.
Alternative Ansätze
- ARIMA: Eine weitere leistungsfähige Modellklasse für Zeitreihenprognosen ist ARIMA (AutoRegressive Integrated Moving Average). ARIMA-Modelle können sehr wirksam sein, erfordern jedoch oft mehr statistisches Wissen, um die Parameter (p, d, q) korrekt abzustimmen. Prophet ist im Allgemeinen stärker automatisiert und für Einsteiger einfacher.
- LSTM-Neuronale Netze: Bei komplexeren, nichtlinearen Mustern in Ihren Trainingsdaten können Sie Long-Short-Term-Memory-(LSTM-)Netze untersuchen, eine Art rekurrentes neuronales Netz. Das erfordert jedoch deutlich mehr Daten und ist eine wesentlich komplexere Umsetzung.
Fazit
Wir haben erfolgreich ein Zeitreihenmodell erstellt, um den Kraftfortschritt vorherzusagen und – vor allem – den Beginn eines Trainingsplateaus zu prognostizieren. Indem wir die Änderungsrate des Prognosetrends analysieren, erhalten wir einen datengestützten Hinweis darauf, dass es Zeit ist, unser Training anzupassen.
Das ist erst der Anfang. Dieselbe Methodik können Sie auf andere Übungen anwenden, andere Kennzahlen wie das Trainingsvolumen verfolgen oder sogar externe Faktoren (Regressoren in Prophet) wie Schlafqualität oder tägliche Kalorienaufnahme einbeziehen, um ein anspruchsvolleres Modell zu erstellen.
Legen Sie also los und protokollieren Sie Ihre Trainingseinheiten! Mit etwas Python und Datenwissenschaft können Sie Ihre Fitnessreise auf die nächste Stufe heben. ✨
Ressourcen
- Prophet Official Documentation
- A Guide to Time Series Forecasting with Prophet in Python 3
- Time Series Forecasting with ARIMA Models in Python
Kurzreferenz
| Aspekt | Wichtige Information |
|---|---|
| Thema | Entwicklung |
| Relevanz | Patientenaufklärung und Bewusstsein |
| Maßnahme | Besprechen Sie dies mit Ihrer Ärztin oder Ihrem Arzt |
| Häufigkeit | Wie von Ihrem Behandlungsteam empfohlen |
| Evidenz | Basierend auf aktuellen klinischen Leitlinien |
Häufig gestellte Fragen
F: Woran erkenne ich, ob das auf mich zutrifft? A: Besprechen Sie Ihre persönliche und familiäre Krankengeschichte mit Ihrer Ärztin oder Ihrem Arzt, um Ihre individuellen Risikofaktoren einzuschätzen und die geeigneten nächsten Schritte festzulegen.
F: Was sollte ich meine Ärztin oder meinen Arzt fragen? A: Gute Fragen sind: „Was bedeuten meine Ergebnisse?“, „Welche Möglichkeiten habe ich?“, „Welche Änderungen des Lebensstils würden helfen?“ und „Wann sollte ich zur Nachkontrolle kommen?“
F: Gibt es Änderungen des Lebensstils, die helfen können? A: Die meisten Gesundheitszustände profitieren von grundlegenden Maßnahmen: ausgewogene Ernährung, regelmäßige körperliche Aktivität (150+ Minuten/Woche), erholsamer Schlaf (7–9 Stunden), Stressbewältigung und der Verzicht auf Tabak.
Medizinischer Haftungsausschluss
Dieser Artikel dient ausschließlich Bildungszwecken und stellt keine medizinische Beratung dar. Konsultieren Sie stets eine qualifizierte medizinische Fachperson, bevor Sie Entscheidungen über Ihre Gesundheit, Behandlung oder Versorgung treffen. Die individuellen Umstände unterscheiden sich, und was für eine Person angemessen ist, muss für eine andere nicht angemessen sein.
Wenn Sie einen medizinischen Notfall erleben, rufen Sie sofort 911 (oder Ihre örtliche Notrufnummer) an.