共计 2179 个字符,预计需要花费 6 分钟才能阅读完成。
问题背景
随着可穿戴设备的普及,基于传感器数据的身体活动监测成为健康管理的关键技术。2025 年泰迪杯 B 题要求参赛者通过加速度计、陀螺仪等穿戴设备采集的时序数据,精确识别步行、跑步、静坐等 6 类日常活动。核心挑战在于:

- 传感器数据存在设备差异和噪声干扰
- 不同活动间的特征边界模糊(如快走 vs 慢跑)
- 实时性要求下需平衡计算复杂度与准确率
数据探索
原始数据集包含 200 名受试者的三轴加速度(100Hz 采样)和角速度数据,通过初步分析发现:
- 数据分布问题
- 静坐类样本占比超 40%,存在类别不平衡
-
不同受试者的信号幅度差异显著(±2g 到±8g)
-
质量问题
- 约 5% 的采样点存在缺失(设备短暂断开)
-
运动剧烈时出现脉冲噪声(峰值检测发现 >10g 的异常点)
-
时序特性
- 活动转换存在过渡期(约 1 - 2 秒的混合状态)
- 频域分析显示步行 / 跑步在 0.5-3Hz 有显著差异
技术方案
数据预处理
缺失值处理
采用滑动窗口线性插值(窗口大小 =10 个采样点):
import pandas as pd
def interpolate_missing(data, window=10):
return data.interpolate(method='linear', limit=window)
异常值过滤
基于动态阈值检测(3 倍移动标准差):
def remove_outliers(data, window=50, n_std=3):
rolling_std = data.rolling(window).std()
threshold = n_std * rolling_std
return data[(data.abs() <= threshold).all(axis=1)]
特征工程
时域特征(5 秒滑动窗口)
- 均值 / 方差 / 峰度 / 偏度
- 过零率、四分位距
- 信号向量幅度(SVM):√(x²+y²+z²)
频域特征(FFT 变换)
- 主要频率成分能量占比
- 频谱熵
- 频域峰度
关键实现:
from scipy import fftpack
def calc_fft_features(signal, sr=100):
fft_vals = np.abs(fftpack.fft(signal))
freqs = fftpack.fftfreq(len(signal), 1/sr)
return {'dominant_freq': freqs[np.argmax(fft_vals)],
'spectral_entropy': entropy(fft_vals/np.sum(fft_vals))
}
模型选型
通过 5 折交叉验证比较三类模型:
| 模型 | 准确率 | 推理速度 (ms/ 样本) | 内存占用 |
|---|---|---|---|
| RandomForest | 89.2% | 0.8 | 中等 |
| XGBoost | 91.5% | 0.5 | 较低 |
| LSTM | 93.1% | 3.2 | 较高 |
最终选择 XGBoost 作为基础模型,因其在速度与精度间的最佳平衡。
代码实现
数据加载与清洗
import numpy as np
import xgboost as xgb
# 加载 CSV 并统一量纲
data = pd.read_csv('activity.csv')
data[['acc_x','acc_y','acc_z']] /= 9.8 # 转换为重力加速度单位
特征管道构建
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
pipeline = Pipeline([('scaler', StandardScaler()),
('clf', xgb.XGBClassifier(
max_depth=6,
n_estimators=200,
learning_rate=0.1
))
])
评估指标
from sklearn.metrics import classification_report
print(classification_report(y_test, y_pred, target_names=activity_labels))
性能优化
- 特征选择
- 使用 SHAP 值分析特征重要性
-
剔除贡献度 <5% 的特征(如频域偏度)
-
超参数调优
-
贝叶斯优化搜索最佳参数组合:
from skopt import BayesSearchCV opt = BayesSearchCV(xgb.XGBClassifier(), {'max_depth': (3, 10), 'gamma': (0, 5) }, n_iter=30 ) -
计算加速
- 启用 GPU 加速(tree_method=’gpu_hist’)
- 使用 Dask 进行分布式特征计算
避坑指南
- 过拟合问题
- 现象:训练集准确率 >95% 但测试集仅 85%
-
解决:增加早停机制(early_stopping_rounds=50)
-
设备差异
- 现象:新设备数据识别率骤降
-
解决:添加设备校准层(z-score 归一化)
-
实时延迟
- 现象:移动端响应超 500ms
- 优化:改用 TFLite 量化模型(模型缩小 4 倍)
扩展思考
该方案可延伸至以下场景:
- 健康监测
- 结合心率数据检测异常活动模式
-
老年人跌倒检测(需增加突发运动识别)
-
运动分析
- 高尔夫 / 网球等专项动作分解
-
通过 LSTM 时序建模改进周期性活动识别
-
工业应用
- 工厂人员作业动作合规性检测
- 基于活动识别的工时统计
完整方案代码已开源在 GitHub,包含 Jupyter Notebook 教程和预训练模型。通过本次实践,我们验证了特征工程与轻量级模型在可穿戴设备数据分析中的有效性,也为实时健康监测系统提供了可靠的技术路径。
正文完
发表至: 未分类
近两天内
