加速度计时间序列数据分类:如何划分训练与测试集?
针对独立时间序列加速度数据的数据集划分方案
首先明确核心原则:你的41个CSV是独立时间序列,绝不能直接合并后随机打乱划分训练/测试集——这样会导致同一序列的片段同时出现在训练和测试中,模型会学到时间相关性,泛化到新序列时表现极差。以下是几种合理的方案:
1. 按独立文件(序列)分层划分
这是最推荐的方案,完全符合独立样本的假设:
- 将41个文件作为独立分组,按分层抽样的方式划分(比如8:2的比例),保证训练集和测试集中4种交通模式的标签比例与整体数据一致。
- 实现时可以用
sklearn.model_selection.StratifiedGroupKFold,把每个文件的索引作为group参数,标签作为y,同时保证分层和分组独立性。 - 示例代码片段:
from sklearn.model_selection import StratifiedGroupKFold import numpy as np # 假设每个文件对应一个group,labels是所有文件的标签列表(默认每个文件内标签统一) groups = np.arange(41) labels = [df['label'].iloc[0] for df in subjects] sgkf = StratifiedGroupKFold(n_splits=5) # 5折交叉验证,可调整为固定训练测试划分 for train_idx, test_idx in sgkf.split(subjects, labels, groups): train_files = [subjects[i] for i in train_idx] test_files = [subjects[i] for i in test_idx] # 后续合并训练文件提取特征,测试文件同理
2. 滑动窗口特征提取+按组划分
Random Forest无法直接处理原始时间序列,需先做滑动窗口特征工程:
- 设定窗口大小(比如1秒=100个采样点,或2秒=200个点,根据数据波动调整),滑动步长(比如50个点,即50%重叠)。
- 对每个窗口提取特征:时域(均值、标准差、最大值、最小值、三轴相关系数)、频域(FFT后各频段能量、主频率)等,每个窗口生成一个特征向量,标签与窗口所属序列的标签一致。
- 划分时,将同一原始序列的所有窗口归为一组,保证训练集和测试集的窗口来自不同原始序列,彻底避免数据泄露。
3. 单文件内划分(仅当文件足够长时使用)
如果每个CSV文件包含的时间序列足够长(比如超过10分钟),可以在单个文件内部划分训练和测试段:
- 比如取每个文件的前80%时间片段做训练,后20%做测试,保证时间上不重叠。
- 这种方案适合每个文件是同一受试者的连续采集,但泛化能力不如按文件分组的方案,模型可能学到特定受试者的行为模式。
关键注意事项
- 特征工程优先:必须先把原始时间序列转换成固定维度的特征向量,再输入Random Forest,否则模型无法有效学习。
- 避免数据泄露:所有特征归一化、统计量计算(比如均值、标准差)必须只在训练集上拟合,再应用到测试集。
- 标签一致性:如果单个文件内存在多个标签(比如同一序列中切换了交通模式),要保证每个滑动窗口的标签与窗口内的主导标签一致。
内容的提问来源于stack exchange,提问作者Maxl Gemeinderat
相关产品推荐
相关产品推荐

