Appearance
口袋里的运动侦探
- 来源:
noai-train/联合训练/Day1/T1 口袋里的运动侦探 洪泽 - 类型:Tabular ML / time-series feature engineering
- 原始资料:
口袋里的运动侦探.md、baseline.py、metrics.py、Day1.md、Day1 ref/T1.../refresult.py - 题面完整性:完整
- 解法资料完整性:有参考代码与 Day1 总结;以下含总结与推断扩展
题面大意
每个样本是一段手机传感器时间窗,包含 6 个通道:三轴身体加速度与三轴陀螺仪,每通道 128 个连续时间点。任务不是直接提交分类模型,而是实现 preprocess_sample(sample),把单个样本转换为不超过 50 维的特征向量。评测器会统一用 RandomForestClassifier(n_estimators=300) 在提取后的特征上训练并预测 6 类人体活动:行走、上楼、下楼、坐、站、躺。
数据特点
数据本质是短窗口多变量时序,但提交接口限制为单样本特征工程。每个样本共有 768 个原始数值,最终只能保留最多 50 维,因此特征选择比模型调参更关键。活动类别之间存在频域与幅值差异:动态动作通常在加速度/角速度的能量、周期性、峰值上更明显,静态姿态则更依赖重力方向、均值和通道间关系。
考点
核心考点是“在强维度约束下提取可解释时序特征”。参赛者需要理解统计量、频域能量、通道模长、轴间相关性等特征对树模型的价值,而不是堆神经网络。题面还明确禁止黑盒编码器和大规模权重矩阵,强调特征应有统计或物理意义。
涉及知识点
- 时间序列窗口统计:均值、标准差、分位数、极值、峰峰值、能量。
- 稳健统计与局部形状:四分位距、MAD、过零率、局部峰谷、差分。
- 周期性/频域特征:自相关、FFT 主频、低频/高频能量比、谱熵。
- 传感器物理量:三轴模长、加速度与角速度能量、姿态倾角。
- 特征选择:互信息、随机森林重要性、交叉验证稳定性。
- 树模型输入设计:随机森林对尺度不敏感,但对信息冗余和噪声特征仍敏感。
解法思路
一个稳健方案是先按通道提取少量强特征,再加入跨通道特征。每个通道可选均值、标准差、最大最小、四分位距、能量、过零率或峰数;对三轴加速度和三轴陀螺仪分别计算模长,再提取均值、标准差、能量和主频。为了不超过 50 维,应通过本地验证或特征重要性筛掉弱特征。
更进一步的方案是针对类别设计特征:坐/站/躺之间姿态差异强,可以保留加速度均值和轴向比例;走/上下楼周期性强,可以保留主频、频域能量和动态范围;上下楼差异可能体现在垂直方向加速度与陀螺仪模式上,可以加入轴间相关系数。
参考解法统计量解释
参考解法最终保留了 50 维特征。它们不是 50 种互不相关的技巧,而是把若干类统计量作用到不同的原始轴或派生序列上,再通过离线验证筛选得到。命名前缀中,acc_x/acc_y/acc_z 表示三轴身体加速度,gyro_x/gyro_y/gyro_z 表示三轴角速度;acc_xy_mag = sqrt(acc_x^2 + acc_y^2)、acc_yz_mag = sqrt(acc_y^2 + acc_z^2)、gyro_xz_mag = sqrt(gyro_x^2 + gyro_z^2) 是二维平面模长;acc_jerk_mag 是相邻时刻三轴加速度差分的模长,近似表示加速度变化快慢;acc3d/gyro3d 则表示三轴整体矩阵。
| 统计量 | 参考实现中的计算 | 入选特征 | 意义和原理 |
|---|---|---|---|
轴能量占比 axis_energy_ratio_i | 对第 i 个轴计算 mean(x_i^2),再除以三轴总能量。i=0,1,2 分别对应 x,y,z。 | acc3d_axis_energy_ratio_0/1/2、gyro3d_axis_energy_ratio_0/1/2 | 描述运动能量主要落在哪个方向。静态姿态中,手机相对重力方向不同会改变各轴占比;行走、上下楼中,主要摆动轴和旋转轴也不同。占比比原始能量更抗整体幅值缩放。 |
加速度主导能量比 acc_energy_dom_ratio | max(axis_energy) / sum(axis_energy)。 | acc_energy_dom_ratio | 衡量三轴加速度是否由单一方向主导。躺、坐、站常有更明确的姿态主轴;动态运动如果多轴共同参与,该值会下降。 |
三轴能量熵 energy_entropy | 令三轴能量占比为 p_i,计算 -sum(p_i * log(p_i))。 | acc3d_energy_entropy | 能量熵刻画能量分布的均匀程度。一个轴占绝大部分能量时熵低,三轴能量接近时熵高。它是轴能量占比的压缩表达,适合区分单方向姿态和多方向运动。 |
协方差特征值 eig1 | 对三轴序列的协方差矩阵做特征值分解,取最大特征值。 | acc3d_eig1 | 最大特征值表示沿某个最佳空间方向的最大方差,即主要运动方向上的波动强度。它不固定依赖手机坐标轴,因此对手机轻微旋转更稳。 |
协方差特征值占比 eig_ratio_1/2 | 将三轴协方差特征值从大到小排序。参考代码中 eig_ratio_1 是最大特征值占比,eig_ratio_2 是第二大特征值占比。 | acc3d_eig_ratio_1、acc3d_eig_ratio_2 | 判断运动轨迹是近似一维、二维还是更分散。若最大特征值占比很高,说明变化集中在一条方向上;第二大特征值较高,说明还有明显的横向摆动或姿态变化。 |
轴间相关系数 corr | 对两个轴去均值后计算归一化内积,相当于 Pearson 相关;方差极小时返回 0。 | acc_corr_xy、acc_corr_yz | 衡量两个加速度轴是否同步变化。走路和上下楼时,身体摆动会让某些轴形成稳定同相或反相关系;静态姿态下相关性通常弱或由固定姿态决定。 |
最大绝对互相关 maxabs_xcorr | 在小范围时间滞后 -4..4 内计算两轴相关,取绝对值最大者。 | gyro_maxabs_xcorr_xy | 普通相关只看同一时刻,互相关允许一个轴的旋转略早或略晚于另一个轴。人体运动中不同旋转方向常存在相位差,这个统计量能捕捉协调性而不过分依赖精确对齐。 |
标准差 std | sqrt(mean((x - mean(x))^2))。 | acc_xy_mag_std | 表示窗口内波动幅度。动态动作的加速度或角速度标准差通常高于坐、站、躺;二维模长上的标准差还能减少手机方向变化对单轴统计的影响。 |
均方根 rms | sqrt(mean(x^2))。 | acc_y_rms | 同时保留平均偏移和波动强度。对加速度来说,某一轴的 RMS 既受姿态下重力分量影响,也受运动幅度影响,因此能兼顾静态姿态和动态强度。 |
四分位距 iqr | percentile_75(x) - percentile_25(x)。 | acc_x_iqr | 稳健的中间 50% 波动范围,不容易被单个异常尖峰影响。它适合描述正常步态摆动幅度,比最大最小值更稳定。 |
p90_p10 分位距 | percentile_90(x) - percentile_10(x)。 | gyro_z_p90_p10 | 比 IQR 覆盖更宽的主体范围,仍然排除了最极端的 10% 尖峰。角速度的宽分位距能反映转动幅度,常用于区分动态运动和静止姿态。 |
中位绝对偏差 mad | 先取中位数 m,再计算 median(abs(x - m))。 | acc_yz_mag_mad | 另一种稳健离散程度统计。模长序列可能存在脚步冲击尖峰,MAD 更关注典型波动而不是极端点。 |
过零次数 zero_cross | 将 0 当作正号,统计相邻时刻符号变化次数。 | acc_x_zero_cross、gyro_x_zero_cross | 表示信号围绕零点来回摆动的频繁程度。周期性步态通常会产生较多正负切换,静态姿态或单向偏移信号则较少。 |
差分标准差 dx_std | 对相邻差分 dx_t = x_t - x_{t-1} 计算标准差。 | acc_z_dx_std | 衡量信号变化速度的波动,近似反映 jerk 或冲击变化。上下楼和走路的垂直方向冲击差异会体现在该统计量上。 |
最大上升差分 dx_max_up | max(diff(x))。 | acc_x_dx_max_up | 捕捉窗口内最剧烈的一次向上跳变。脚步落地、身体快速摆动等动作会带来局部陡升。 |
最大下降差分 dx_max_down | -min(diff(x))。 | acc_xy_mag_dx_max_down | 捕捉最剧烈的一次下降。与最大上升配合,可以描述冲击后的回落幅度和方向不对称性。 |
正差分均值 dx_pos_mean | 只取 diff(x) > 0 的部分求均值,没有正差分则为 0。 | gyro_x_dx_pos_mean | 描述平均上升速度,而不是单个最大尖峰。对角速度来说,它能反映身体或手机绕某轴持续加速旋转的强度。 |
局部谷值数量 n_valleys | 统计满足 x_t < x_{t-1} 且 x_t <= x_{t+1} 的局部低点个数。 | gyro_x_n_valleys | 局部谷值可近似表示周期运动中的低谷次数。步态越规律,单位窗口内的峰谷结构越稳定;静态动作通常谷值少或幅度小。 |
局部谷值均值 valley_mean | 找到所有局部谷值后取其数值平均;没有谷值则为 0。 | acc_jerk_mag_valley_mean | acc_jerk_mag 本身非负,谷值均值描述相邻冲击之间的低活动水平。步态中冲击和缓冲交替出现,谷底高度能反映动作是否连续、是否有明显停顿。 |
固定滞后自相关 autocorr_k | 对 x[:-k] 和 x[k:] 计算相关系数。 | gyro_z_autocorr_4/8、acc_x_autocorr_4/8/16、acc_y_autocorr_2/4、gyro_x_autocorr_16、gyro_y_autocorr_8、acc_z_autocorr_4、acc_yz_mag_autocorr_1、acc_xy_mag_autocorr_1、gyro_xz_mag_autocorr_2 | 自相关衡量信号隔 k 个采样点后是否仍相似。周期运动在接近步态周期或半周期的滞后上会出现稳定相关,静态姿态则可能表现为持续高相关或缺少周期结构。多个固定滞后相当于用少量点采样周期性。 |
最佳自相关 autocorr_best | 在滞后 2..16 内计算自相关并取最大值。 | acc_x_autocorr_best、acc_z_autocorr_best、acc_yz_mag_autocorr_best、gyro_x_autocorr_best | 不预设准确周期,而是在一段合理步态滞后范围内寻找最强重复性。不同人的步频和手机位置不同,最佳自相关比单一滞后更有弹性。 |
平均自相关 autocorr_mean_2_16 | 对滞后 2..16 的自相关取平均。 | gyro_z_autocorr_mean_2_16、acc_x_autocorr_mean_2_16、gyro_y_autocorr_mean_2_16 | 表示短滞后范围内整体平滑性和重复性。若信号在多个短滞后上都保持相似,说明动作稳定或姿态平稳;若平均值低,则可能是噪声、冲击或非周期运动。 |
分段能量 segN_energy | 将 128 点窗口等分成 4 段,每段 32 点,对第 N 段计算 mean(x^2)。 | acc_x_seg0_energy | 保留时间位置上的强度信息。全窗口能量会丢掉“强运动发生在开头还是结尾”,分段统计可以帮助随机森林识别窗口内部的不稳定或过渡动作。 |
分段标准差 segN_std | 将窗口等分成 4 段,对指定段计算标准差。 | acc_y_seg2_std、acc_y_seg3_std | 描述局部时间段的波动。若一个窗口覆盖动作转换,后两段标准差可能与前半段不同;这类局部统计补足全局标准差。 |
这些统计量覆盖了三类信息:幅值强度、周期形状和三轴空间结构。幅值类统计量负责区分静止与运动强弱;自相关、过零、峰谷和差分负责描述步态节律与冲击;轴能量、协方差特征值和相关系数负责描述手机姿态、主运动方向和轴间耦合。随机森林会在这些低维、可解释特征上自动组合非线性规则,因此特征不需要手动写成“如果是上楼就怎样”的硬规则。
可选/多种解法
基础解法:每通道 5 到 6 个统计量,加上模长统计,控制在 40 到 50 维。
频域增强解法:对每通道或模长做 FFT,保留前若干频段能量比例、主频和谱熵,替换掉部分冗余统计量。
自动筛选解法:离线生成大量候选特征,用交叉验证随机森林评估,再按重要性/稳定性选前 50 维写死到提交函数中。
特殊技巧
特征维度限制下,三轴模长很有价值,因为它压缩了方向变化并保留运动强度。对静态动作,通道均值比高阶频域特征更关键;对动态动作,频域能量和峰数能补足简单均值无法表达的周期性。
调参优化
这题的核心超参数是 50 维特征预算下的特征选择。建议离线生成统计、频域、模长、轴间相关等候选特征,再通过分组交叉验证调候选集合、FFT 频段数、窗口统计种类、随机森林/GBDT 参数和最终保留维度。模型侧可调树深、树数、正则和 class_weight,但若特征不足,模型调参收益有限。验证切分要按用户或采集段分组,避免相邻窗口泄漏导致选出的 50 维特征不泛化。
注意事项
preprocess_sample 不能使用标签,也不要依赖全局训练集统计,除非这些统计以固定常量形式离线选择且不泄漏测试标签。返回长度必须不超过 50。随机森林由评测器统一训练,因此提交代码的重点是稳定、快速、纯特征提取。
推广意义
这题是竞赛 AI 中“先理解数据,再设计特征”的典型练习。它推广到可穿戴设备、工业传感器、音频短窗和其他时序分类任务:在数据量有限或模型受限时,手工统计特征仍然非常有效。