wellallyTech

我们都经历过这种情况。你去健身房,完成一次训练,感觉自己像超级英雄——结果第二天醒来却感觉像被一辆货运列车撞了。在高性能运动和高压力编程的世界里,倦怠不是突然的悬崖,而是生理储备的缓慢侵蚀。📉

标准健身应用会给你一个“准备度评分”,但这些往往是反应式的。如果你想领先于曲线,你需要从“我现在感觉如何?”转向“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+
  • 技术栈PyTorch, prophet, pandas, requests
  • 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(深度学习),我们创建了一个不仅回顾过去,还能展望未来的系统。这允许你在崩溃之前调整训练负荷、优先考虑睡眠或跳过深夜编码会话。

接下来是什么?

  1. 集成你的 Apple Health 或 Whoop 数据。
  2. 添加一个 Slack/Discord 机器人,在你的“身体电池”降至 10% 时向你发送私信。
  3. 查看 wellally.tech/blog 的高级模式,了解如何为数千用户扩展这些模型。

保持健康,继续编码!🚀💻


你觉得这有帮助吗?在下面评论中分享你最喜欢的穿戴设备或你如何追踪恢复情况! 👇