wellallyTech

我們都經歷過這樣的時刻。健身房練完一場,感覺自己像超級英雄——結果隔天醒來卻像被貨運火車撞到。在高表現運動員與高壓程式設計的世界裡,過勞並不是突然斷崖,而是生理儲備的緩慢侵蝕。📉

一般健身 App 會給你一個「準備度分數」,但這些通常都是被動反應。如果你想領先曲線,就必須從「我現在感覺如何?」轉變成「24 小時後我會在哪裡?」。今天,我們將使用 Oura Ring 的心率變異性(HRV)資料,打造一個混合的時間序列預測引擎

結合 Facebook Prophet 的季節性趨勢偵測與 PyTorch Transformers 的序列建模能力,我們就能在疲勞閾值轉化為身體疲憊之前先行預測。

架構設計:為什麼要混合?🏗️

預測生理狀態並不容易。HRV 資料有雜訊、有季節性(晝夜節律),而且因人而異。簡單的移動平均值無法應付。

  1. Facebook Prophet:處理「巨觀」趨勢——每週的訓練週期與每月的壓力模式。
  2. Transformer(PyTorch):捕捉「微觀」訊號——HRV 中那些細微的非線性下降,預示神經系統即將達到臨界點。
graph TD
    A[Oura API] -->|Raw HRV & Sleep Data| B(Pandas Preprocessing)
    B --> C{Hybrid Model}
    C -->|Decomposition| D[Facebook Prophet: Trend & Seasonality]
    C -->|Sequence Learning| E[PyTorch Transformer: Anomaly Detection]
    D --> F[Feature Fusion Layer]
    E --> F
    F --> G[Predictive Alert: Burnout Risk %]
    G --> H[Action: Rest/Active Recovery/Push]

Enter fullscreen mode Exit fullscreen mode


準備事項 🛠️

跟著操作前,你需要:

  • Python 3.9+
  • 技術堆疊PyTorchprophetpandasrequests
  • Oura 個人存取權杖:用來取得你的生物辨識資料。

步驟 1:從 Oura API 取得生物辨識資料 💍

首先,我們需要抓取心率變異性(HRV)資料。HRV 是衡量自主神經系統壓力的黃金標準。

import requests
import pandas as pd

def fetch_oura_hrv(api_token, start_date, end_date):
    url = f'https://api.ouraring.com/v2/usercollection/daily_readiness'
    headers = {'Authorization': f'Bearer {api_token}'}
    params = {'start_date': start_date, 'end_date': end_date}

    response = requests.get(url, headers=headers, params=params)
    data = response.json()['data']

    # Extracting hrv_average from the readiness object
    df = pd.DataFrame([
        {'ds': x['day'], 'y': x['contributors']['hrv_balance']} 
        for x in data
    ])
    return df

# Usage
# df_hrv = fetch_oura_hrv('YOUR_TOKEN', '2023-10-01', '2024-01-01')

Enter fullscreen mode Exit fullscreen mode


步驟 2:使用 Prophet 建立趨勢模型 📈

Prophet 非常適合做基線預測,因為它能優雅地處理缺失資料與假日(或深夜吃披薩的時刻)。

from prophet import Prophet

def get_prophet_baseline(df):
    m = Prophet(changepoint_prior_scale=0.05, daily_seasonality=False)
    m.fit(df)

    future = m.make_future_dataframe(periods=7)
    forecast = m.predict(future)

    return forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']]

Enter fullscreen mode Exit fullscreen mode


步驟 3:使用 Transformer 進行深度特徵萃取 🧠

Prophet 看的是「森林」,而 Transformer 看的是「葉子」。我們使用多頭注意力機制,檢視過去 14 天的睡眠品質、活動量與 HRV,來預測明天的「電池」狀態。

import torch
import torch.nn as nn

class HRVTransformer(nn.Module):
    def __init__(self, input_dim, model_dim, nhead, num_layers):
        super(HRVTransformer, self).__init__()
        self.embedding = nn.Linear(input_dim, model_dim)
        self.encoder_layer = nn.TransformerEncoderLayer(d_model=model_dim, nhead=nhead)
        self.transformer_encoder = nn.TransformerEncoder(self.encoder_layer, num_layers=num_layers)
        self.fc_out = nn.Linear(model_dim, 1)

    def forward(self, src):
        # src shape: (batch_size, seq_len, input_dim)
        src = self.embedding(src)
        # Transformer expects (seq_len, batch_size, model_dim)
        src = src.permute(1, 0, 2)
        out = self.transformer_encoder(src)
        # We take the last time step's prediction
        out = self.fc_out(out[-1, :, :])
        return out

# Quick Init
model = HRVTransformer(input_dim=5, model_dim=64, nhead=8, num_layers=3)
print("Transformer Initialized! 🥑")

Enter fullscreen mode Exit fullscreen mode


「官方」做法:進階模式 🥑

雖然這個 DIY 方法很適合「公開學習」,但生產等級的健康科技系統需要更穩健的訊號處理(例如使用小波轉換降低雜訊)與嚴謹的交叉驗證。

若想深入了解生產就緒的時間序列架構,以及如何大規模處理高頻率生物辨識串流,強烈建議前往 WellAlly Tech Blog。他們有許多關於「生理數位孿生」的精彩見解,能將這個概念推向更高層次。


步驟 4:預測崩潰時刻 🚨

我們定義一個過勞閾值。如果預測的 HRV 低於 Prophet 計算出的「正常」基線 1.5 個標準差,就會觸發高疲勞警示。

def check_burnout_risk(actual_hrv, predicted_hrv, baseline_lower):
    if predicted_hrv < baseline_lower:
        return "⚠️ CRITICAL: Burnout Imminent. Force Rest Day."
    elif predicted_hrv < actual_hrv * 0.9:
        return "🟡 WARNING: Fatigue accumulating. Reduce intensity."
    return "✅ Green Light: System optimized."

Enter fullscreen mode Exit fullscreen mode

結論:資料勝過直覺 📉

結合 Prophet(統計嚴謹度)與 Transformers(深度學習),我們打造出一個不只回顧過去、更能預測未來的系統。這讓你能在崩潰前調整訓練量、優先補眠,或是跳過深夜的 coding 時段。

接下來呢?

  1. 整合你的 Apple Health 或 Whoop 資料。
  2. 新增 Slack/Discord bot,當你的「身體電池」只剩 10% 時發送私訊提醒。
  3. 前往 wellally.tech/blog 查看進階模式,了解如何將這些模型擴展到數千名使用者。

保持健康,快樂 coding!🚀💻


覺得這篇文章有幫助嗎?歡迎在下方留言分享你最愛的穿戴裝置,或是你如何追蹤恢復狀態! 👇