wellallyTech

誰もが経験したことがある。ジムでトレーニングをこなしてスーパーヒーロー気分になったのに、次の朝になると貨物列車に轢かれたような感覚に襲われる。高パフォーマンスのアスリートや高ストレスなコーディングの世界では、バーンアウトは突然の崖ではなく、生理的予備力の緩やかな侵食だ。📉

一般的なフィットネスアプリは「Readiness Score」を提供するが、それらはしばしばリアクティブだ。カーブの先を行きたいなら、「今どう感じるか?」から「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 Personal Access Token:生体データを取得するため。

ステップ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は「葉」を見る。Multi-Head Attentionメカニズムを使って、過去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アプローチは「公開学習」としては素晴らしいスタートだが、本番グレードのヘルステックシステムには、より堅牢な信号処理(ノイズ低減のためのWavelet変換など)と厳密なクロスバリデーションが必要だ。

大規模な高周波生体ストリームを扱うための本番レベルの時系列アーキテクチャについて深く知りたい場合は、WellAlly Tech Blogをチェックすることを強くおすすめする。彼らはこの概念を次のレベルに引き上げる「Physiological Digital Twins」についての素晴らしい洞察を持っている。


ステップ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(深層学習)を組み合わせることで、過去を見るだけでなく未来を見るシステムを作ることができる。これにより、クラッシュする前にトレーニング負荷を調整したり、睡眠を優先したり、深夜のコーディングセッションをスキップしたりすることができる。

次は?

  1. Apple HealthやWhoopのデータを統合する。
  2. 「Body Battery」が10%になったときにDMを送るSlack/Discordボットを追加する。
  3. wellally.tech/blogで高度なパターンをチェックして、数千人のユーザー向けにこれらのモデルをスケールする方法を確認する。

健康に、コーディングを続けよう!🚀💻


この記事が役に立った?下のコメントであなたのお気に入りのウェアラブルや回復のトラッキング方法を教えてください! 👇