
内容提要
作者信息

Guile Yu
信息与计算科学专业本科学位,专注机器学习与数据采集领域。擅长R语言、Python数据分析及机器学习算法应用。拥有多年行为数据分析与健康建模项目经验。
摘要
本文利用穿戴设备采集的三轴加速度数据,构建了一套完整的身体活动监测与行为分析框架。文章依次回答了四个核心问题:(1)如何基于MET值对日常活动进行精确分类与时长统计?(2)如何利用机器学习回归模型实时估计个体的MET值?(3)如何通过无监督聚类识别夜间睡眠阶段分布?(4)如何自动检测久坐行为并建立分级预警机制?通过随机森林回归、K-Means聚类与XGBoost分类模型的融合应用,本文为智能健康管理提供了可落地的技术方案。
关键词:MET值;随机森林;时间滑动窗口;K-Means聚类;XGBoost
This paper constructs a comprehensive physical activity monitoring and behavioral analysis framework using tri-axial acceleration data from wearable devices. It addresses four core questions: (1) How to accurately classify daily activities based on MET values and calculate duration statistics? (2) How to estimate real-time MET values using machine learning regression models? (3) How to identify nocturnal sleep stages through unsupervised clustering? (4) How to automatically detect sedentary behavior and establish a tiered alert mechanism? By integrating Random Forest regression, K-Means clustering, and XGBoost classification, this paper provides a practical technical solution for intelligent health management.
Keywords: MET value; Random Forest; Sliding Time Window; K-Means Clustering; XGBoost
正文
数据获取
│
│ ├─ annotation字段提取MET值
│ ├─ 活动状态五分类映射
│ └─ 累计时长计算 + 可视化
│
│ ├─ 5秒滑动窗口 → 时域+频域特征
│ ├─ 随机森林回归模型训练
│ └─ 20位志愿者MET预测 + 运动强度统计
│
│ ├─ 夜间MET<1数据筛选
│ ├─ K-Means聚类 → 五类睡眠模式
│ └─ 各阶段时长统计 + 睡眠结构分析
│
├─ 久坐标签构建(MET≤1.6且≥30min)
├─ XGBoost分类模型 + 欠采样平衡
└─ 三级预警输出(安全/一般/高风险)
数据预处理与活动分类统计
数据说明
每位志愿者对应一份由穿戴设备中微机电系统传感器记录的加速度数据,格式如下:
表1:加速度数据字段说明
time(时间戳) | X | Y | Z | annotation |
|---|---|---|---|---|
毫秒级时间戳 | 三轴加速度 | 三轴加速度 | 三轴加速度 | 含MET的标签 |
注释字段包含该时间点的活动类型及对应的MET值,示例为"sleeping;MET0.95"。预处理的核心是从中提取MET值并据此进行分类。
活动分类方法
根据国际通用的MET值分级标准,我们将活动划分为五类:
MET < 1:睡眠状态
1 ≤ MET < 1.6:静态活动
1.6 ≤ MET < 3:低强度活动
3 ≤ MET < 6:中等强度活动
MET ≥ 6:高强度活动
活动持续时长∆t通过相邻时间点之间的时间差计算:∆t = (tᵢ₊₁ - tᵢ) / 3600
单位为小时,用于后续统一统计。该计算方法简单直接,能够快速精准地将原始时间戳数据转化为可用于分析活动时长的有效信息。
求解结果
下表为100位志愿者活动统计汇总结果,数值保留四位小数,单位为小时:
表2:志愿者身体活动信息统计汇总表(部分)
志愿者ID | 记录总时长 | 睡眠总时长 | 高强度运动 | 中等强度 | 低强度运动 | 静态活动 |
|---|---|---|---|---|---|---|
P001 | 29.6667 | 10.5833 | 0.0000 | 3.7303 | 3.0008 | 7.4011 |
P002 | 26.0833 | 6.2500 | 0.3567 | 1.1702 | 1.8108 | 6.5528 |
P003 | 27.1667 | 6.6667 | 0.0000 | 6.7722 | 2.7375 | 4.3475 |
P004 | 28.0000 | 7.5000 | 0.0000 | 2.5809 | 3.1359 | 6.7192 |
P005 | 25.0000 | 4.3333 | 0.0000 | 1.8883 | 3.9003 | 6.9438 |
... | ... | ... | ... | ... | ... | ... |
P099 | 27.0000 | 6.0000 | 0.0519 | 1.1728 | 3.6809 | 4.1135 |
P100 | 26.4167 | 7.2500 | 0.0581 | 1.6426 | 1.0033 | 7.2850 |
从汇总结果可见,志愿者们在各活动状态的时间分布存在显著个体差异。
活动统计可视化
为了直观展示志愿者在不同活动类型下的时长分布,我们采用了多种可视化方法。这些图表帮助理解各类活动的时间分布,揭示志愿者的活动模式差异。
以志愿者P024为例,下图通过饼图展示其活动占比:

图1:志愿者P024活动占比饼图
根据图1,志愿者P024大部分时间花费在睡眠和静态活动上——睡眠占比33.2%,静态活动占比32.3%。高强度和中等强度运动占比较少,表明该志愿者可能存在更多静态行为。

Bi-LSTM三轴加速度传感器人类活动识别|附AI智能体、代码和数据
原文链接:https://tecdat.cn/?p=36613
接着使用雷达图同时展示多个维度的数据,将不同变量以从中心点辐射出的轴来表示。

图2:志愿者P024活动分布雷达图
图2显示,志愿者P024的睡眠、静态活动和低强度运动时长较长,尤其在睡眠方面表现突出,而中等强度及高强度运动时长较短。这表明该志愿者的活动模式偏向低强度的日常活动和较长的休息时间。
柱状图展示每位志愿者在不同活动类别下的总时长,可以清晰看到各类活动在总体活动中的占比。

图3:活动时长分布柱状图
从图3中可以看出,志愿者在高强度运动和静态活动之间的时长差异较大。某些志愿者的高强度运动时长较长而静态活动时长较短,表明这些志愿者更活跃;相反,某些志愿者的静态活动时长较长,显示其活动水平较低。
小提琴图通过核密度估计展示数据分布形状,能清晰呈现各类活动时长在集中趋势、离散程度和分布范围上的差异。

图4:活动时长小提琴图
从图4可以发现,不同活动类别的时长分布差异明显。睡眠总时长的分布较为集中且均值较高;高等强度运动总时长普遍较短且分布相对集中。静态活动总时长的小提琴图较宽,显示出数据的离散程度较大——其最小值仅为1.8564小时(P068),最大值则达到13.6901小时(P090)。
三维图从空间角度展示五类活动状态的时长分布:

图5:五类活动状态时长三维分布图
从图5可见,志愿者在五类活动状态上的时间分布存在明显个体差异。睡眠时长在个体之间波动较大,部分志愿者睡眠时间极少(可能与数据记录不全或佩戴时间不足有关);静态行为与低强度活动为大多数人的主要活动状态,符合日常行为习惯;高强度运动时间在部分志愿者中占比偏高,推测为高频锻炼或标签异常;中等强度活动整体均衡分布。
答辩高频提问:为什么选择MET值作为活动分类的标准而非直接使用加速度幅值?
MET(代谢当量)是衡量身体活动强度的国际通用指标,相比加速度幅值,它能直接与能量消耗挂钩,便于跨个体、跨设备比较。加速度幅值受传感器量程、佩戴位置等因素影响较大,而MET值通过标注信息与活动类型建立了标准化映射,提高了分类的可比性和可解释性。
MET值预测:随机森林回归模型构建
建模思路
原始数据包含志愿者的三轴加速度数据(X、Y、Z)以及标签字段中标注的真实MET值,此外还包含年龄与性别等个体属性信息。建模总体思路为:先对连续加速度数据进行滑动窗口分段处理以降低复杂度并保留时间特性;再从每个时间窗口提取时域特征、加速度幅值特征和频域特征,结合个体属性构建样本特征集;然后采用随机森林回归作为主模型进行训练;最后将训练好的模型应用于20位志愿者的数据,得到MET值预测结果并统计运动状态时长。
时间窗口构建与特征提取
在处理加速度数据时,将连续冗长的数据划分成固定长度的片段,便于针对每个片段进行特征提取。这里将原始加速度数据按5秒为单位划分为多个不重叠的时间窗口。
设某志愿者的加速度数据为三维时间序列(xₜ, yₜ, zₜ),窗口长度T=5秒,则第i个窗口内包含的数据为:
Wᵢ = {(xₜ, yₜ, zₜ)} | t ∈ (tᵢ, tᵢ + T)

图6:时间滑动窗口加速度分段示意图
在每个窗口中提取以下特征:
时域特征:对每个轴向的加速度数据,计算均值(mean)、标准差(std)、最大值(max)、最小值(min):μₐ = (1/n) Σ aₜ, σₐ = √(1/n Σ (aₜ - μₐ)²)
合成加速度特征:计算三个轴加速度的合成加速度 Mₜ = √(xₜ² + yₜ² + zₜ²),同样提取其均值、标准差等统计量。
频域特征:对加速度幅值序列{Mₜ}进行离散傅里叶变换(DFT),寻找最大幅值对应的频率分量作为主频:k* = argmax|M̂(k)|

图7:加速度统计特征直方图
概念注释
滑动窗口就像用一把固定长度的尺子将时间序列"切"成等长的小段。为什么不用更长的窗口(如30秒)?——窗口太长会模糊瞬态变化的细节,太短(如1秒)则无法形成稳定的统计特征,5秒是一个在信息丰富度和计算效率之间的平衡选择(行业术语:时间粒度权衡)。
特征相关性分析
绘制特征相关性热力图查看各特征变量之间的相关程度:

图8:各特征变量之间的特征相关热力图
特征相关热力图中红色代表正相关(颜色越红相关性越强),蓝色代表负相关(颜色越蓝相关性越强)。x_std、y_std、z_std等特征与目标MET值呈现一定程度正相关——如x_std与target相关性达0.59,说明这些特征值增大时MET值有增大趋势。magnitude_mean与magnitude_std相关性达0.76,说明合成加速度的均值和标准差关联紧密。
AI智能体提示词与代码实现
下面是本项目MET值预测模型的完整对话过程。第一轮构建基础随机森林模型,第二轮进行模型评估与优化。
第一轮对话:基础随机森林回归模型构建
嗨,帮我用随机森林搭建一个MET值预测模型。我这边有一批穿戴设备的三轴加速度数据,已经用5秒滑动窗口做好了特征提取——每个窗口包含x、y、z三轴的均值、标准差、最大值、最小值,还有合成加速度的均值、标准差和主频,以及志愿者的年龄和性别信息。目标变量是窗口内的平均MET值。数据在window_features.csv里,请先用默认参数训练随机森林回归器,100棵树,输出训练集和测试集上的R²得分,看看基础效果如何。
import pandas as pd
import numpy as np
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
# 读取滑动窗口特征数据
feat_df = pd.read_csv("window_features.csv")
feature_cols = [c for c in feat_df.columns if c not in ['target_met', 'subject_id']]
X_matrix = feat_df[feature_cols]
Y_target = feat_df['target_met']
# 划分训练集和测试集(80/20)
X_train, X_test, Y_train, Y_test = train_test_split(
X_matrix, Y_target, test_size=0.2, random_state=42
)
# 构建随机森林回归模型
forest_model = RandomForestRegressor(
n_estimators=100, max_depth=15, random_state=42, n_jobs=-1
)
forest_model.fit(X_train, Y_train)
# 基础预测与评分
Y_train_pred = forest_model.predict(X_train)
Y_test_pred = forest_model.predict(X_test)
train_r2 = forest_model.score(X_train, Y_train)
test_r2 = forest_model.score(X_test, Y_test)
print(f"训练集R²: {train_r2:.4f}, 测试集R²: {test_r2:.4f}")
......
# 省略了特征重要性排名输出和前10重要特征可视化代码
阅读原文进群获取完整内容及更多AI见解、行业洞察,与900+行业人士交流成长。
第二轮对话:模型评估指标计算与残差诊断
第一轮模型结果不错,现在帮我做完整的模型评估。需要计算MSE、RMSE、MAE和R²四个指标。另外我还想看看残差的分布情况——请帮我绘制残差分布直方图来检查是否近似正态,再画一张预测值vs真实值的散点图,用红色虚线标出理想预测线y=x。我想确认模型在低MET值区间和高MET值区间的表现有没有差异。
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
import matplotlib.pyplot as plt
import numpy as np
# 计算四项评估指标
mse_score = mean_squared_error(Y_test, Y_test_pred)
rmse_score = np.sqrt(mse_score)
mae_score = mean_absolute_error(Y_test, Y_test_pred)
r2_score_val = r2_score(Y_test, Y_test_pred)
print(f"MSE: {mse_score:.4f}")
print(f"RMSE: {rmse_score:.4f}")
print(f"MAE: {mae_score:.4f}")
print(f"R²: {r2_score_val:.4f}")
# 残差分布分析
residual_array = Y_test - Y_test_pred
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.hist(residual_array, bins=50, edgecolor='black', alpha=0.7)
plt.xlabel('残差')
plt.ylabel('频数')
plt.title('残差分布直方图')
# 预测值vs真实值对比
plt.subplot(1, 2, 2)
plt.scatter(Y_test, Y_test_pred, alpha=0.3, s=10)
plt.plot([Y_test.min(), Y_test.max()], [Y_test.min(), Y_test.max()], 'r--', lw=2)
plt.xlabel('真实MET值')
plt.ylabel('预测MET值')
plt.title('预测值与真实值对比')
......
# 省略了分区段误差分析和异常样本定位代码
模型评估结果
将上述代码应用于数据后,得到以下指标:
表3:随机森林模型度量指标
MSE | RMSE | MAE | R² |
|---|---|---|---|
0.2674 | 0.5171 | 0.3009 | 0.6331 |
残差分布图和预测值与真实值对比图如下:

图9:残差分布图
从图9可以看出,残差分布近似于正态分布,大部分残差集中在0附近,说明模型的预测值与真实值在多数情况下较为接近,预测误差在整体上是平衡的。

图10:预测值与真实值对比图
从图10可以看出,大部分数据点分布在理想预测线(y=x,红色虚线)附近,且随着真实MET值增加预测MET值也相应增加,说明模型能捕捉到正相关关系。在真实MET值较低(如1-4之间)的区域,数据点相对分散,模型在低值区的误差波动较大;在真实MET值较高(如5-8之间)的区域,数据点相对更集中,预测表现相对更好。
模型应用:20位志愿者MET预测与运动强度统计
在附件1数据上充分训练后,将模型应用于20位志愿者的无标签数据,得到连续时间段的MET值序列。预测结果按既定标准划分为睡眠、静态、低强度、中等强度和高强度五类状态,统计各状态下的运动时长。
表4:P101志愿者的MET值预测(部分)
time | x | y | z | predicted_value |
|---|---|---|---|---|
28:00.0 | 0.37465948 | -0.46540746 | 0.7840617 | 1.415138377 |
28:00.0 | 0.37465948 | -0.48103774 | 0.7840617 | 1.415138377 |
28:00.0 | 0.37465948 | -0.4966681 | 0.7840617 | 1.415138377 |
... | ... | ... | ... | ... |
22:45.7 | 0.7893246 | -0.24929455 | -0.5506189 | 0.99587411 |
表5:20位志愿者运动强度信息汇总(部分)
志愿者ID | 总时长(h) | 高强度(h) | 中等强度(h) | 低强度(h) | 静态(h) |
|---|---|---|---|---|---|
P101 | 25.5000 | 0.0000 | 0.0708 | 9.1722 | 9.8556 |
P102 | 24.5000 | 0.0000 | 0.2403 | 11.0986 | 7.7139 |
P103 | 29.1667 | 0.0042 | 0.7861 | 11.3361 | 8.2917 |
P104 | 26.3333 | 0.0000 | 0.1597 | 13.3958 | 4.7083 |
P105 | 27.0000 | 0.0000 | 0.0764 | 8.8014 | 8.9528 |
对汇总后20名志愿者不同活动类别进行分析:

图11:不同活动类别的时长分布
从图11可以看出,睡眠总时长箱线范围大、数据离散度高,反映出志愿者睡眠时长个体差异显著;静态活动总时长离散度适中。这表明20位志愿者在各类活动上的时间分配差异大,反映出不同的生活习惯和运动偏好。
答辩高频提问:R²=0.6331这个结果意味着什么?是否可以认为模型预测能力不足?
在穿戴设备行为分析领域,R²达到0.63属于中等偏上的水平。加速度数据本身具有较高的随机噪声,且MET值是连续型标签,预测难度本身高于分类问题。建议结合RMSE(0.5171)和MAE(0.3009)综合判断——这两个指标表明平均预测误差约为0.3-0.5个MET单位,在实际健康监测场景中属于可接受范围。如有更高精度需求,可考虑引入深度学习模型或增加传感器模态。
睡眠阶段识别:K-Means无监督聚类
建模思路
睡眠阶段识别是一个典型的无监督聚类问题。我们先从每位志愿者夜间加速度数据中筛选MET值小于1的片段,对每个滑动窗口提取三轴加速度的均值、标准差、最大值、最小值和合加速度等特征,然后利用K-Means聚类算法对睡眠状态实施分层界定。最后通过肘部图确定最佳聚类数,用CH指数和DBI指数评估聚类效果。
K-Means聚类方法
K-Means是一种迭代求解的聚类分析算法。其核心思路是:预将数据分为K组,随机选取K个对象作为初始聚类中心,然后计算每个对象与各聚类中心之间的距离,将每个对象分配给距离最近的聚类中心。具体步骤为:
Step1:随机选择k个数据点作为初始簇中心
Step2:计算每个数据点到各簇中心的距离,分配到最近的簇
Step3:重新计算每个簇的中心(簇内所有点的均值)
Step4:重复Step2和Step3直到簇中心不再变化
目标函数为簇内平方误差:J = Σₖ Σₓᵢ∈Cₖ ‖xᵢ - μₖ‖²,其中μₖ为簇k的质心,欧氏距离‖xᵢ - μₖ‖² = Σⱼ(xᵢⱼ - μₖⱼ)²。
AI智能体提示词与代码实现
对话:K-Means睡眠阶段聚类
我需要做睡眠阶段的无监督聚类分析。数据是从志愿者的夜间加速度计数据中筛选出来的(MET<1的片段),已经用5秒滑动窗口提取了每个窗口的特征:三轴均值、标准差、最大值、最小值、合加速度的均值和标准差。请帮我先用肘部法则画图确定最佳聚类数k(范围1-10),然后用K-Means聚类,输出CH指数和DBI指数评估聚类质量。最后根据聚类中心将5个簇映射为入睡期、浅睡期、熟睡期、深睡期和快速动眼期。
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import calinski_harabasz_score, davies_bouldin_score
import matplotlib.pyplot as plt
import numpy as np
# 读取夜间睡眠加速度特征数据
sleep_feat = pd.read_csv("sleep_features.csv")
scaler = StandardScaler()
sleep_scaled = scaler.fit_transform(sleep_feat)
# 肘部法则确定最佳聚类数
inertia_vals = []
k_range = range(1, 11)
for k_val in k_range:
km = KMeans(n_clusters=k_val, random_state=42, n_init=10)
km.fit(sleep_scaled)
inertia_vals.append(km.inertia_)
plt.plot(k_range, inertia_vals, 'bo-')
plt.xlabel('聚类数k')
plt.ylabel('畸变程度(Inertia)')
plt.title('肘部图:确定最佳聚类数')
# 用k=5执行最终聚类
final_km = KMeans(n_clusters=5, random_state=42, n_init=10)
cluster_labels = final_km.fit_predict(sleep_scaled)
# 评估指标
ch_idx = calinski_harabasz_score(sleep_scaled, cluster_labels)
db_idx = davies_bouldin_score(sleep_scaled, cluster_labels)
print(f"CH指数: {ch_idx:.4f}")
print(f"DBI指数: {db_idx:.4f}")
......
# 省略了根据聚类中心能量值映射睡眠阶段含义和统计各阶段时长的代码
模型求解与评估
肘部图的分析结果如下:

图12:肘部图
从图12可以看出,随着k值从1逐渐增大到10,畸变程度不断减小。当k值增大到约5时曲线下降趋势明显变缓,出现类似"肘部"的转折点——此时继续增加k值,畸变程度的下降幅度不再明显,因此判断最佳聚类数为5。
点击标题查阅往期内容
以下是关于XGBoost的精选文章合集,涵盖核心原理、实战案例与进阶应用,所有资源均提供完整代码和数据:
领域 | 应用案例 | 关键成果 |
|---|---|---|
金融风控 | Python贷款违约预测:XGBoost+贝叶斯调参 | 在严重不平衡数据中召回率显著提升,F1分数从0.01优化至0.8+ |
工业制造 | XGBoost+SHAP预测卷烟吸阻,实时优化工艺 | 降低检测成本70%,年节约超2800万元,投资回收期不足1个月 |
时间序列 | LSTM与XGBoost融合预测商店销售量、比特币价格 | 结合时序特征工程与特征重要性分析,优于单一模型 |
不平衡数据 | SMOTE过采样+XGBoost处理破产预测 | 通过合成少数类样本,提升对破产公司的识别能力 |
XGBoost凭借其正则化控制、稀疏感知、并行计算等优势,成为金融、工业、医疗等领域的首选算法之一。未来趋势包括:
如需特定场景(如医疗诊断、推荐系统)的细化代码,可进一步说明需求,我会推荐针对性资源。
表6:K-Means模型度量指标
度量指标 | CH指数 | DBI指数 |
|---|---|---|
值 | 184567.7377 | 0.9886 |
CH指数为184567.7377,是一个较高的数值,说明各簇之间区分明显、同簇内数据点聚集紧密,聚类效果较为理想。DBI指数为0.9886(一般DBI远大于1时聚类效果较差),表明聚类间的相似度处于可接受范围。
睡眠阶段识别结果
根据聚类结果,将睡眠阶段分为五种:入睡期(睡眠模式一)、浅睡期(睡眠模式二)、熟睡期(睡眠模式三)、深睡期(睡眠模式四)、快速动眼期(睡眠模式五)。
表7:志愿者睡眠不同阶段时间展示(部分)
志愿者ID | 睡眠总时长 | 模式一 | 模式二 | 模式三 | 模式四 | 模式五 |
|---|---|---|---|---|---|---|
P101 | 6.4014 | 0.3597 | 0.9389 | 2.2958 | 2.5764 | 0.2306 |
P102 | 5.4472 | 0.8986 | 1.0167 | 1.0403 | 1.5611 | 0.9306 |
P103 | 8.7486 | 1.8042 | 2.8028 | 2.2111 | 1.4514 | 0.4792 |
... | ... | ... | ... | ... | ... | ... |
P118 | 4.8528 | 1.3139 | 0.5764 | 1.1556 | 0.8917 | 0.9153 |
P119 | 4.8514 | 0.5042 | 0.3222 | 0.7153 | 1.4139 | 1.8958 |
P120 | 4.0250 | 0.6472 | 0.8764 | 0.9694 | 1.2569 | 0.2750 |
概念注释
K-Means"肘部法则"就像一个裁缝在做衣服——增加布料(增大k)总能让衣服更合身(畸变程度降低),但到了一定程度后再加布料收益甚微,那就是"刚好合适"的点。CH指数则像一把尺子,既衡量各簇之间的"疏远程度"(类间分离度),又衡量每个簇内的"亲密程度"(类内紧凑性),数值越大越好。
睡眠模式可视化分析
通过折线图展示不同志愿者在五种睡眠模式下时长的变化趋势:

图13:不同志愿者在五种睡眠模式下时长的变化趋势折线图
从图中可以看出部分志愿者浅睡时间较长,部分志愿者的深睡时间更充足。这种差异性有助于评估个体睡眠质量——如"深度睡眠时长占比"等指标,可作为个性化健康建议的基础。
睡眠模式总时长相关性热力图:

图14:睡眠模式总时长相关性热力图
从图14可以看出,大部分睡眠模式总时长之间呈现正相关关系,但相关性强弱存在差异。少数睡眠模式之间相关性较弱或呈现负相关。
久坐行为识别:XGBoost分类与预警机制
建模思路
首先对100位志愿者数据进行预处理,从annotation列提取编码,依据《身体活动汇编》中常见身体活动的MET值标准确定久坐行为编码(MET≤1.6且单段静态行为时间≥30分钟),符合久坐条件的标记为"1",不符合的标记为"0",同时删除缺失值。考虑到样本类别不平衡(非久坐样本远多于久坐样本),采用随机欠采样平衡样本数量。然后以5秒时间窗口构建特征值,最后选用XGBoost模型进行二分类建模。
数据预处理
以P001志愿者为例,标注后的样本分布如下:
表8:P001志愿者不同状态类别数量
状态类别 | 数量 |
|---|---|
0(其他行为) | 8032086 |
1(久坐行为) | 1782282 |
观察发现状态类别为0的行数量远大于状态为1的数量,类别不平衡可能导致模型训练时偏向多数类。因此采用随机欠采样方法,随机删除部分多数类样本以平衡类别数量。
符合久坐行为状态的标签编码如下:
表9:符合久坐行为状态的标签编码(部分)
编号 | 标签 |
|---|---|
1 | 5080 |
2 | 7024 |
3 | 7025 |
4 | 9000 |
5 | 9010 |
6 | 9013 |
7 | 9025 |
8 | 9030 |
... | ... |
22 | 21005 |
概念注释
欠采样就像做蛋糕时调整配方比例——如果糖是面粉的5倍,蛋糕会甜得发腻(模型偏向多数类)。欠采样就是"少放点糖",让糖和面粉的比例大致相当,这样蛋糕才能品尝出每种成分的风味(模型才能公平学习各类别的特征)。
将100组志愿者数据汇总后,在随机种子为42的情况下以80%和20%的比例划分训练集和测试集。测试集不同类别数据分布情况如下:

图15:测试集不同类别数据分布图
由上图可知,久坐行为状态(1)与其他行为状态(0)并无简单线性关系,久坐行为状态集中度较高。
AI智能体提示词与代码实现
第一轮对话:基础XGBoost久坐分类模型
我有一份久坐行为识别的二分类数据集,久坐(标签1)和非久坐(标签0)样本比例约1:4,已做随机欠采样平衡。特征是5秒窗口从三轴加速度提取的时域和频域特征。请帮我用XGBoost搭建分类器,默认参数训练,输出混淆矩阵、准确率、召回率、精确率和F1值。另外绘制ROC曲线计算AUC。
from xgboost import XGBClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import (accuracy_score, recall_score, precision_score,
f1_score, confusion_matrix, roc_auc_score,
roc_curve)
import matplotlib.pyplot as plt
import seaborn as sns
# 加载久坐行为特征数据
sedentary_df = pd.read_csv("sedentary_features.csv")
feat_X = sedentary_df.drop(['sedentary_tag', 'subj_id'], axis=1)
target_y = sedentary_df['sedentary_tag']
# 划分训练集和测试集
X_tr, X_te, Y_tr, Y_te = train_test_split(
feat_X, target_y, test_size=0.2, random_state=42, stratify=target_y
)
# XGBoost分类模型构建
xgb_clf = XGBClassifier(
n_estimators=150, max_depth=6, learning_rate=0.1,
random_state=42, use_label_encoder=False, eval_metric='logloss'
)
xgb_clf.fit(X_tr, Y_tr)
# 预测与评估
Y_prob = xgb_clf.predict_proba(X_te)[:, 1]
Y_hat = xgb_clf.predict(X_te)
acc = accuracy_score(Y_te, Y_hat)
rec = recall_score(Y_te, Y_hat)
prec = precision_score(Y_te, Y_hat)
f1 = f1_score(Y_te, Y_hat)
auc = roc_auc_score(Y_te, Y_prob)
print(f"准确率: {acc:.4f}, 召回率: {rec:.4f}")
print(f"精确率: {prec:.4f}, F1: {f1:.4f}, AUC: {auc:.4f}")
# 混淆矩阵热力图
cm = confusion_matrix(Y_te, Y_hat)
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues')
......
# 省略了ROC曲线绘制和特征重要性排序代码
第二轮对话:预警规则设计与应用
模型效果可以,现在请帮我设计一个久坐预警规则:如果某位志愿者单段久坐超过30分钟则需要关注,累积久坐超过2小时触发高风险预警。对20位志愿者逐个应用模型识别久坐段,统计每人的久坐段数、最大单段持续时长(分钟)、累计久坐总时长(小时),并输出预警等级(安全/一般提醒/高风险)。结果整理成表格。
# 久坐预警规则设计
def assess_sedentary_risk(segments, durations_min, total_hrs):
"""
根据久坐段数和累计时长评估预警等级
segments: 久坐段数(单段≥30分钟)
total_hrs: 累计久坐总时长(小时)
"""
if segments == 0:
return '安全'
elif total_hrs < 1.0:
return '一般提醒'
else:
return '高风险'
# 对20位志愿者分别评估
risk_results = []
for subj in subject_list:
segs, max_dur, cum_hrs = analyze_subject_sedentary(subj, xgb_clf)
level = assess_sedentary_risk(segs, max_dur, cum_hrs)
risk_results.append({
'志愿者ID': subj,
'久坐段数': segs,
'最大时长(min)': round(max_dur, 6),
'累计时长(h)': round(cum_hrs, 6),
'预警等级': level
})
......
# 省略了逐段久坐合并逻辑和边界处理代码
模型评估
利用Python求解得到以下评估结果:

图16:XGBoost模型测试集混淆矩阵
表10:各项评估指标
数据集 | 准确率 | 召回率 | 精确率 | F1 |
|---|---|---|---|---|
测试集 | 0.74 | 0.71 | 0.92 | 0.80 |
模型的测试集准确率、召回率、精确率和F1分别达到74%、71%、92%和80%,精确率高达92%意味着模型对久坐的误报率较低,这在健康预警场景中较为重要。
ROC曲线如下:

图17:XGBoost模型的ROC曲线
图中蓝色ROC曲线下面积AUC为0.85,黑色对角线代表随机猜测。AUC值0.85表明模型区分久坐与非久坐行为的能力较好。
健康预警机制与久坐识别结果
为实现个体健康提升功能,我们设计了三级预警规则:
安全:无超过30分钟的久坐段 → 正常活动
一般提醒:存在1次久坐段且总时长小于1小时 → 建议站立、轻运动
高风险:久坐段累计超过2小时 → 强烈建议停止久坐行为
将XGBoost模型应用于20位志愿者的加速度数据,输出每位用户的久坐分析结果:
表11:20位志愿者久坐行为识别统计与预警等级
ID | 久坐段数 | 最大时长(min) | 累计时长(h) | 预警等级 |
|---|---|---|---|---|
P101 | 3 | 43.33 | 1.95 | 高风险 |
P102 | 2 | 39.58 | 1.20 | 高风险 |
P103 | 1 | 38.75 | 0.65 | 一般提醒 |
P104 | 0 | 0.00 | 0.00 | 安全 |
P105 | 5 | 70.42 | 3.95 | 高风险 |
P106 | 0 | 0.00 | 0.00 | 安全 |
P107 | 1 | 30.83 | 0.51 | 一般提醒 |
P108 | 1 | 35.83 | 0.60 | 一般提醒 |
P109 | 0 | 0.00 | 0.00 | 安全 |
P110 | 5 | 77.92 | 4.44 | 高风险 |
P111 | 1 | 30.83 | 0.51 | 一般提醒 |
P112 | 2 | 42.50 | 1.25 | 高风险 |
P113 | 1 | 31.67 | 0.53 | 一般提醒 |
P114 | 3 | 52.92 | 1.92 | 高风险 |
P115 | 2 | 38.33 | 1.22 | 高风险 |
P116 | 2 | 39.58 | 1.21 | 高风险 |
P117 | 0 | 0.00 | 0.00 | 安全 |
P118 | 2 | 42.50 | 1.26 | 高风险 |
P119 | 2 | 38.33 | 1.27 | 高风险 |
P120 | 0 | 0.00 | 0.00 | 安全 |
20位志愿者的久坐行为可视化统计如下:

图18:20位志愿者的久坐行为统计情况
从图18可以发现,不同志愿者的久坐时间差异显著——部分志愿者最大单段久坐时间较长,反映其久坐行为较为突出,可能面临更高的健康风险;多数志愿者的累计久坐时间高于最大单段久坐时间,意味着很多人虽单次久坐不长但多次累积也较为可观。
答辩高频提问:精确率0.92、召回率0.71——为什么精确率远高于召回率?这种权衡在健康预警场景是否合理?
精确率高说明"模型判为久坐的用户确实在久坐"的概率很高(低误报),而召回率偏低说明存在部分久坐行为未被模型检出(漏报)。在健康预警场景中,高误报会让用户频繁收到虚假提醒而逐渐忽视警告(狼来了效应),因此适当牺牲召回率换取高精确率是合理的设计选择。如果应用场景对漏报容忍度更低(如医疗监测),可调整分类阈值来平衡两者。
模型评价
模型优点
本文运用特征提取与窗口化处理思想,抓住了影响行为识别与MET值预测的关键变量,将复杂的时间序列识别问题转化为标准的监督学习与聚类分析问题。对连续冗长的加速度数据采用滑动窗口方法划分处理,合理设置了窗口长度、步长与分类阈值,有效降低了数据处理复杂度的同时保留了时间特性。
文中所用的随机森林、K-Means与XGBoost等算法具有建模灵活、鲁棒性强、可解释性好等优点,对于求解活动分类、MET值预测与无标签状态划分模型较为适用。
模型充分结合实际,考虑了活动强度区分、时间持续性与健康风险等级等关键因素,得到的模型结构合理,可应用于日常健康监测、办公场景行为识别与智能提醒系统。
模型缺点
数据量较大,建立模型时未充分优化时间复杂度,运行效率有待提升;部分数据不完整,后续获得完整数据后可进一步提高模型精度。
在建立预测模型和行为识别模型上,目前只用到了随机森林回归模型和XGBoost模型,方式较为单一,后续可尝试使用多种组合的集成学习模型进行优化,从而提高预测精确度。
年龄、性别等个体属性对活动状态的影响可能具有非线性甚至交互特征,而本文将其作为线性输入项处理,可能忽略了更复杂的边际效应和潜在因子间的耦合关系。
参考文献
[1] 洪金涛,陈思同,刘阳.《身体活动汇编》(Compendium of Physical Activities):内容、应用与发展[J].上海体育学院学报,2020,44(09):53-63.
[2] 方匡南,吴见彬,朱建平等.随机森林方法研究综述[J].统计与信息论坛,2011,26(03):32-38.
[3] 李欣海.随机森林模型在分类与回归分析中的应用[J].应用昆虫学报,2013,50(04):1190-1197.
[4] 李娜.基于人体运动状态识别的可穿戴健康监测系统研究[D].北京工业大学,2013.
[5] 韩雅雯.K-Means聚类算法的改进及其在信息检索系统中的应用[D].云南大学,2016.
[6] 李占山,刘兆赓.基于XGBoost的特征选择算法[J].通信学报,2019,40(10):101-108.
[7] 徐逸,甄佳宁,蒋侠朋等.无人机遥感与XGBoost的红树林物种分类[J].遥感学报,2021,25(03):737-752.
[8] 雷亚国,贾峰,周昕等.基于深度学习理论的机械装备大数据健康监测方法[J].机械工程学报,2015,51(21):49-56.
总结
核心问题与解决方案
问题一:如何基于加速度数据对日常活动进行精确分类与时长统计?
解决方案:从annotation字段提取MET值,按五级标准(睡眠<1、静态1-1.6、低强度1.6-3、中等3-6、高强度≥6)进行分类,通过时间戳差值计算累计时长并汇总为标准化表格。结合饼图、雷达图、小提琴图等多种可视化方法揭示个体活动模式差异。
问题二:如何构建能实时估计个体MET值的机器学习模型?
解决方案:采用5秒滑动窗口提取时域(均值、标准差、极值)和频域(主频)特征,结合年龄性别构建随机森林回归模型。模型评估指标为MSE=0.2674、RMSE=0.5171、MAE=0.3009、R²=0.6331。残差近似正态分布,在低MET区间预测误差略大,整体预测趋势正确。
问题三:如何通过无监督学习识别夜间睡眠阶段分布?
解决方案:利用K-Means对夜间MET<1的加速度数据进行聚类,肘部图确定最优聚类数k=5,对应入睡期、浅睡期、熟睡期、深睡期和快速动眼期五个阶段。CH指数为184567.74,DBI指数为0.9886,聚类效果良好。
问题四:如何自动检测久坐行为并建立分级预警机制?
解决方案:根据MET≤1.6且单段≥30分钟定义久坐标签,采用随机欠采样处理类别不平衡后构建XGBoost分类模型。测试集准确率0.74、精确率0.92、F1=0.80、AUC=0.85。设计了安全、一般提醒、高风险三级预警规则。
技术创新与业务价值
• 全链路建模框架:从活动分类、MET预测、睡眠识别到久坐预警,构建了穿戴设备健康监测的完整技术链路,各模型之间数据流衔接顺畅。
• 滑动窗口特征工程:以5秒窗口为基本单元提取时域和频域特征,在保留时间动态特性的前提下大幅降低数据维度,使后续建模过程更加高效。
• 实用导向的预警设计:XGBoost模型配合三级预警规则,可直接嵌入智能手环或健康管理App中,实现久坐行为的实时提醒。
• 可量化的业务价值:以P101志愿者为例,模型识别出3段久坐行为(累计1.95小时,最长43.3分钟),转化为高风险预警,为用户提供了可操作的健康改善建议。