一维数据分类是个挺有意思的活儿,这几年我收到的私信里,问得最多的就是滚动轴承故障检测,拿CWRU(凯斯西储大学)那套公开数据做实验;其次就是雷达HRRP飞机信号识别、心电信号多分类这类场景。这几个方向看似八竿子打不着,但拿到手里你会发现,它们底层全是一维时序/序列数据,处理的套路高度相通。这篇文章我就拿这三个典型场景做骨架,把一维数据分类从数据处理到模型训练再到工程部署的完整链路,掰开揉碎讲清楚。
先说清楚写这篇文章的定位:如果你刚接触一维数据分类,不知道从哪下手,或者已经用深度学习跑通了几个Demo但总觉得哪里不对,这篇文章就是给你准备的。我尽量不堆公式,重点讲清楚每一步为什么这么做,踩过哪些坑,换一个数据集、换一类信号时,哪些经验可以直接搬过去。
1. 三个典型场景的共同点:为什么它们能用一套办法处理
很多人一听到“CWRU轴承数据”“HRRP雷达信号”“心电信号”,会觉得这是三个八竿子打不着的领域,其实从数据处理角度讲,它们本质上是同一类问题:拿到一条一维序列,做预处理,切成样本,送入分类模型,输出类别标签。
先说CWRU(凯斯西储大学)滚动轴承数据集。这是轴承故障诊断领域最常用的公开基准数据集,由驱动端轴承在不同负载、不同故障直径下采集的振动加速度信号组成。正常轴承是一类,内圈故障、外圈故障、滚动体故障各按损伤直径分了几个档位,加起来通常是10个类别左右。这类数据的核心特点是:故障信号有周期性冲击成分,但现场噪声很大,而且健康状态下的振动信号也有随机波动,所以单看时域波形很难直接分类。
再看HRRP飞机信号。高分辨距离像(High Resolution Range Profile)是雷达目标识别里的一种特征,它把一个展宽目标在雷达径向上的散射点分布投影成一串幅度序列。不同机型、不同姿态角下,HRRP的形态差异很大,但同一架飞机在不同姿态下的HRRP又变化剧烈,这就带来了“姿态敏感性”问题。传统的做法是提取统计特征后送入分类器,现在更多人直接拿一维CNN、LSTM或Transformer去端到端学习。
心电信号多分类就更好理解了。标准心电(ECG)导联采集出来就是一条电压随时间变化的曲线,临床上要区分正常窦性心律和各种心律失常(比如室早、房早、房颤、束支传导阻滞等)。难点在于:个体差异大、类别极度不平衡(正常样本远多于异常样本)、每拍形态易受噪声和基线漂移干扰。
这三个场景放到一起看,处理流程高度一致:原始一维序列 -> 去噪/归一化/分段 -> 构造样本集 -> 设计一维分类模型 -> 训练、调参、评估 -> 部署。所以我的建议是,不管你现在做的是哪个方向,先把“通用一维分类流水线”搭好,然后针对具体信号的特点去做定制化调整。这篇文章后面几节,就拿三个场景交叉举例,让你看完能对号入座。
2. 数据预处理:这条流水线决定了模型上限
2.1 去噪:别一上来就滤波,先搞清楚噪声长什么样
我见过太多初学者拿到CWRU数据,第一步就上一个带通滤波器,恨不得把所有非故障频段都砍掉。这么做不是不行,但很容易把有效信息一起滤没了。轴承故障信号的冲击成分往往分布在较宽的频带上,如果滤波器通带设置不当,早期微弱故障反而会被滤掉。
我的习惯是先做一段“观察性分析”:把原始信号拉出来看时域波形,同时做FFT看频谱,然后再决定要不要滤波。CWRU数据本身采集质量较高,很多研究直接不做滤波也能分类,但实际工业现场的信号就没这么干净了,这时可以用小波阈值去噪或经验模态分解(EMD)做预处理,把环境噪声和结构共振成分分离掉。对HRRP信号来说,去噪通常要处理的是幅值归一化和背景杂波抑制,方法上可以类比。对心电信号,则更多使用带通滤波(比如0.5Hz-45Hz)去除基线漂移和工频干扰。
2.2 归一化:一类信号对应一套正确姿势
一维数据分类里最容易出问题的是归一化。归一化方式很多——最大最小归一化、Z-score标准化、按样本归一化、按全局统计归一化——每种的适用场景都不一样。
对CWRU轴承数据,我是按样本做最大最小归一化。如果一个样本是一个固定长度的时间窗(比如1024个采样点),那么就按这个窗内的最大值和最小值把整段数据映射到[-1,1]或[0,1]。这样做的好处是保留了同一段信号内部的相对起伏,而故障冲击恰恰体现在相对起伏上。
对心电信号,通常先做Z-score标准化,也就是减去均值再除以标准差,尤其当你要对一整段长时程记录做分析时,按整段统计量归一化能抑制个体间的幅值差异。但注意,如果做逐拍分类,你最好按“拍”归一化,而不是按整段,否则不同病人的心跳幅值差异会被抹平,模型反而更难泛化。
对HRRP信号,归一化更讲究。HRRP的幅度受雷达距离、目标尺寸、雷达系统增益等影响,通常要做幅度归一化来消除这些外部因素。很多人直接对整条HRRP序列做L2范数归一化(除以向量的欧几里得范数),这在公开实验里很常见。但如果涉及目标强度信息用,就得先想清楚是否要保留强度特征,因为L2归一化会把强度信息完全抹掉。
2.3 分段与数据增强:样本量不够,重叠切窗来凑
一维信号分类很少用整条长序列做输入,一般是切段。切段有两个原则:一是每段要足够长,能包含至少几个完整的事件周期;二是类别标签要可靠。比如CWRU数据,振动信号是包含故障冲击的连续波形,你可以用重叠滑窗切出大量样本,通常窗口长度取1024或2048个采样点,步长取窗口的四分之一到二分之一,这样既能扩增样本,又能保持相邻窗口之间的时序连续性。
对心电信号,切窗有一个额外麻烦:一个窗口里可能包含多个心跳,类别标签怎么定?标准的做法是先做R峰检测,然后以每个R峰为中心截取固定长度的心拍窗口,这样每个窗口对应一个明确的心拍类别。如果某些异常类别样本太少,可以对少数类做合成过采样(SMOTE)或者用时序变形增强——比如小幅时间缩放、加噪声、幅值抖动。
HRRP数据增强就更关键了,因为姿态角变化导致同一目标的HRRP差异极大。经典的增强手段是“角域插值”:在邻近姿态角对应的HRRP之间做插值,生成中间角度的样本。此外,添加乘性噪声和随机像元置零也常用于模拟不同雷达工作状态下的变化。
2.4 这三类信号预处理参数参考
| 信号类型 | 采样率/规模 | 推荐窗口长度 | 归一化方式 | 主要噪声来源 |
|---|---|---|---|---|
| CWRU轴承振动 | 12kHz/48kHz可选 | 1024或2048点 | 样本内最大最小归一化 | 环境振动、结构共振 |
| HRRP距离像 | 序列长度通常256~1024 | 全序列或固定子窗 | L2范数归一化或功率归一化 | 杂波、姿态敏感 |
| 心电信号 | 采样率125~1000Hz不等 | 以R峰为中心截取400ms~1s | 按拍Z-score或全局Z-score | 肌电、基线漂移、工频 |
3. CWRU轴承故障检测实战:从原始数据到多分类模型
3.1 数据组织:别在训练集里混进“同源样本”
CWRU数据一个长期被忽视的问题就是数据泄露。官网提供的采集工况包含不同负载(0HP、1HP、2HP、3HP),每个负载下的故障数据来自同一批实验轴承的同一段连续采集。如果你直接用滑窗切样本,然后按样本随机划分训练集和测试集,那么训练集和测试集里可能混着来自同一连续信号的窗口,模型记忆的是“同一段波形的不同片段”,而不是真正的故障模式,导致验证准确率高得离谱,实际部署却完全不行。
我处理CWRU数据的标准方式是:先按“故障类型+故障直径+负载”分组,再做分组划分,确保同一个原始信号段的所有窗口都只在训练集或只在测试集出现。更严格的划分是按不同负载做训练/测试分离,比如在0HP、1HP、2HP负载上训练,在3HP负载上测试,这样可以检验模型对未知工况的泛化能力。实测下来,很多人报告“99%+准确率”的CWRU模型,一旦做跨负载测试,准确率会掉到85%~92%这个区间,这才是真实水平。
3.2 特征输入:原始信号直接送进去,可以先做包络谱
CWRU轴承故障检测有两条技术路线:一条是直接在原始振动信号上训练一维CNN,另一条是提取特征后再分类。我个人的倾向是:如果计算资源允许、数据量充足,直接上原始信号配合一维卷积可以学到丰富特征;如果样本少、想快速验证流程,那就先做包络谱分析,把时域信号通过Hilbert变换求包络,再做FFT得到包络谱,以包络谱作为输入特征。
举个例子,针对内圈故障,滚动体通过内圈缺陷时会激起高频共振,直接看原始波形很难稳定捕获,但包络谱里故障特征频率(比如BPFI,内圈故障特征频率)处的峰值会明显突出。当然,做分类时不需要手工算这些频率,把包络谱整段送入一维CNN,让模型自己学,往往效果更稳。
3.3 一维CNN模型结构参考
我常用的基础结构:
- 输入层:长度1024的一维序列,单通道
- 第一卷积块:Conv1D(64, kernel_size=3, stride=1) + ReLU + MaxPool1D(2)
- 第二卷积块:Conv1D(128, kernel_size=3) + ReLU + MaxPool1D(2)
- 第三卷积块:Conv1D(256, kernel_size=3) + ReLU + GlobalAveragePooling1D
- 全连接层:256个神经元 + Dropout(0.5)
- 输出层:Softmax,类别数对应故障类别总数
这个结构在CWRU 10分类任务上,分组划分后准确率大概在94%~97%,加一点训练技巧能到98%。相比炫酷的Transformer,一维CNN在中小样本量下更稳,训练更快,也不太容易过拟合。
3.4 训练细节与调参心法
训练时我用Adam优化器,初始学习率1e-3,配合ReduceLROnPlateau策略(验证集损失连续5个epoch不下降就降为原来的1/5)。Batch size取64。为防止过拟合,除Dropout外,我还加了早停(early stopping),监视验证集损失,patience设为10个epoch。
一个容易被忽略的点是损失函数。CWRU数据各类别样本量大体均衡,用交叉熵没毛病。但如果你的实际生产数据类别不平衡,建议换加权交叉熵或Focal Loss。把CWRU当“算法练手”可以,但真正上线时,类别不平衡才是常态,这一点先有认知,后面换任何数据集都会受益。
4. HRRP飞机信号识别:姿态敏感性是最大的坑
4.1 HRRP数据的特点:同一架飞机,换个角度就换张脸
HRRP本质是目标散射点在雷达视线方向上的投影。目标相对于雷达的姿态角变化,哪怕只变几度,散射中心的叠加方式都会明显变化,因此HRRP序列的形态对姿态角极其敏感。这也是HRRP识别比CWRU轴承识别难一个数量级的核心原因。
解决姿态敏感性问题,主流有三个思路:一是分帧处理,把姿态域划分为多个角域,每个角域单独建模,测试时先判断姿态角落在哪个帧,再选择对应模型;二是设计姿态不变的特征,比如提取HRRP的模、强度谱、中心矩等统计量,这类特征对姿态变化相对鲁棒;三是用深度网络做端到端学习,让网络自己去适应姿态变化,前提是训练数据要覆盖足够的姿态角度范围。
4.2 预处理细节:幅值归一化和距离对齐
HRRP序列送到模型之前,最少要处理两件事:幅度归一化和距离对齐。
幅度归一化上面提过,通常用L2范数归一化。实际操作中,我还会先做一次“去均值”,因为HRRP中可能存在直流分量,去均值后归一化更稳定。
距离对齐指的是HRRP序列的起点并不一定对应目标的真实起始位置,不同样本之间可能存在距离偏移。如果直接拿未对齐的序列训练卷积网络,卷积核会学到“偏移不变”的伪特征,效果打折扣。常用的对齐方法是基于相关性的包络对齐——计算当前HRRP与参考HRRP的互相关,用峰值位置做平移补偿。这个步骤很不起眼,但对识别准确率的提升非常明显。
4.3 利用复值HRRP还是实值HRRP
很多HRRP研究直接使用幅值序列,即丢弃相位信息。但相位中包含目标散射点的径向相对位置信息,在低信噪比条件下对识别有帮助。如果数据是复值HRRP,可以考虑双通道输入(实部+虚部)交给网络,或者转化为幅度+相位两个通道。我在实验中试过,信噪比正常时,幅度特征已经够用;信噪比偏低时,加入相位通道能带来3~5个百分点的提升。
4.4 模型对比:CNN、LSTM还是Transformer
HRRP序列长度通常几百点,目标类别数少(三五类、最多十几类),样本总量不大。这样的场景下,我优先选一维CNN,兼顾性能和计算效率。LSTM能建模序列依赖,但在分类任务上优势不突出。Transformer需要较多数据,HRRP这种千级样本的规模下容易过拟合,不太建议一上来就用大模型。
如果非要试Transformer,可以用“卷积块+全局注意力”的轻量结构:先用两层一维卷积做局部特征提取,把序列长度压缩,再过一个自注意力层,最后接分类头。这样既缓解了数据不足的问题,又能利用注意力捕捉非局部依赖。
5. 心电信号多分类:从R峰检测到类别不平衡实战
5.1 心电数据不是“切段就能喂”,先做心拍定位
心电信号分类的第一步不是直接切窗,而是做心拍定位。常规做法是Pan-Tompkins算法做R波检测,找到每个QRS波群的位置,然后以R峰为中心向前取约200ms、向后取约400ms,截出一个心拍。采样率如果是360Hz,那一个心拍大约200个采样点;如果采样率是500Hz,那就是约300个点。
截出的每个心拍都对应一个标注。公开数据集(比如常见的MIT-BIH心律失常数据)自带注释,可以映射成类别标签。我自己会把类别归并成几大类:正常(N)、室上性异常(S)、室性异常(V)、融合波(F)、未知类(Q),因为原始标注有几十种细类,直接做几十分类既难又不符合实际需求。
5.2 类别不平衡:别让“正常类”一家独大
心电数据最典型的问题是正常样本数量远大于异常样本。我遇到的一次实验中,正常心拍有7万多条,而室性早搏只有不到5000条,比例接近15:1。如果直接交叉熵训练,模型只要全预测成正常类就能拿到93%以上的准确率,但完全没有诊断价值。
处理不平衡的思路有几个:一是对异常类做重采样(上采样或合成样本);二是对正常类做下采样,控制比例在2:1到5:1之间;三是修改损失函数,给少数类更高的权重,或者用Focal Loss降低易分类样本的权重,让模型把注意力放在难分的异常上;四是评估指标别只看准确率,重点看F1分数、特异度、敏感度,尤其是少数类的召回率。
5.3 一个心拍不够时,可以引入上下文窗口
单心拍分类虽然简单,但会丢失相邻心跳之间的节奏信息。某些心律失常(比如房颤)本身就体现在RR间期不规律上,只单看一个心拍很难判断。所以进阶做法是“单拍特征+上下文特征”拼接:每个样本不仅包括目标心拍的波形,还附带前几个心拍的RR间期、相邻心拍的形态差异,形成一个融合特征向量再分类。实测下来,这种设计比纯单拍模型在多类心律失常分类上稳很多。
5.4 心电信号迁移学习的可能性
如果你在一个大型心电数据集上训练了一个多分类模型,可以把它当作特征提取器,冻结前几层,只微调最后的分类层,迁移到另一个小数据集上。这种方法非常适合标注样本稀缺的场景。我在小样本心电数据上试过,迁移学习比从零训练准确率高10%以上。注意微调时学习率要调低(比如1e-4),避免破坏已经学到的通用心拍特征。
6. 分类模型选型:同一套模型,三个场景的适配边界
6.1 一维CNN:所有场景的“万金油”,但超参要跟着信号走
一维CNN在CWRU轴承、HRRP、心电三个场景都能用,但卷积核尺寸和网络深度要根据序列特点调整。CWRU振动信号采样率高,局部冲击持续几个到几十个采样点,小卷积核(3或5)就够了;心电QRS波形的宽度通常100ms左右,按采样率360Hz算大概36个点卷积核选9或15能更好覆盖单个波形但不至于跨太多拍;HRRP的散射中心宽度较窄,卷积核3就够了。
一个通用调参技巧:先用小网络快速跑通流程,确认数据划分和评测逻辑正确,再逐步加宽、加深网络。许多人一上来堆参数量,跑了半天发现是数据泄露导致的高分,白费力气。
6.2 时序模型的取舍:LSTM适合HRRP,不适合轴承
LSTM在HRRP识别中有一点用武之地,因为有学者认为HRRP序列的散射点分布存在姿态演化上的序列依赖关系,LSTM能够建模这种姿态变化。但轴承振动信号是周期性冲击,卷积网络完全能搞定,用LSTM反而是画蛇添足。我的习惯是:除非你明确知道信号里存在长距离依赖关系值得建模,否则优先用卷积,把时序模型留给那些“顺序本身有意义”的数据。
6.3 轻量化设计:边缘设备上的一维分类
现在不少场景要求模型部署在嵌入式设备上,CWRU轴承检测的在线监测、可穿戴心电设备的拍分类,都对模型的参数量和推理速度有要求。轻量化设计通常有三板斧:深度可分离卷积替代标准卷积、全局平均池化替代全连接、量化到INT8或FP16。我用过一个极简模型,参数量不到200K,在CWRU跨负载测试上准确率还有90%左右,部署到树莓派之类设备上完全够用。
7. 实验评估与落地经验:准确率高不一定是好模型
7.1 正确划分训练/验证/测试集是“1”,其余都是“0”
做一维数据分类,我会花最多时间在数据划分上。除了前面说的CWRU按工况分组划分外,心电数据还要注意同一个病人的心拍不能同时出现在训练集和测试集中,否则模型学过该病人的波形,测试就会虚高。HRRP也类似,相邻姿态角的样本不能跨越划分边界,否则模型可能靠角域连续性“蒙对”。
7.2 评估指标别只看准确率:混淆矩阵才是真相
多分类场景下,准确率容易被多数类主导。我每次训练完成都会先看混淆矩阵。以CWRU为例,如果“滚动体故障”被大量误判成“内圈故障”,说明这两类特征本来就相似,需要检查数据标签、重新设计特征,而不是盲目调模型。
心电分类更是如此,敏感度(对异常的检出率)和特异度(正常被误判为异常的比例)要同时看。比如室性早搏检测的目标是别漏检,宁可多报一点,也要把这类高危异常抓住。具体阈值可以根据业务场景微调,模型输出的概率分数在此处发挥作用。
7.3 部署时别忘了“流式处理”
很多人离线实验做得很漂亮,一到现场部署就出问题。核心原因在于:离线实验是整段信号切窗后批量分类,部署时是边采边分类的流式场景。以轴承检测为例,你需要设计滑动窗口队列,每来一个采样点更新窗口,每隔固定间隔输出一次分类结果,并做一定的时间平滑(比如连续3次都判为故障才报警),避免单次误判触发误报警。
心电设备也一样,不可能等积累完整文件再分析,必须实时检测R峰、实时切拍、实时分类,还要处理脱落、饱和等异常数据。我在部署阶段踩过的坑是:离线数据预处理里的滤波函数用到了filtfilt(零相位双向滤波),在线流式处理中无法直接使用,否则会引入延迟。解决方案是换成同参数的因果滤波,并做延迟补偿。这种细节,书本上不会写。
7.4 数据漂移:现场数据永远比公开数据集“脏”
公开数据集质量高、标注准,但现场数据有传感器老化、安装位置偏移、工况突变等引入的分布漂移。CWRU数据模型迁移到实际产线会掉点,这是必然的。应对办法是:上线前做少量目标域数据微调;部署后持续监控预测置信度分布,一旦大批量样本的低置信度比例升高,触发重新收集数据、重新训练的流程。
8. 附:一维数据分类完整流程速查清单
整个流程做下来,无论你最后做哪个方向,都可以对照这张清单自查:
- 数据理解:先看原始波形、采样率、通道数、类别分布,别急着建模。
- 数据划分:按“来源”分组划分,保证训练集和测试集不共享同一数据段或同一对象。
- 预处理:去噪、归一化、切段/检测事件、对齐(HRRP尤其需要)。
- 数据增强:按信号特点增广样本量,注意不能改变信号的核心生理/物理意义。
- 模型选型:中小样本优先一维CNN,有明确序列依赖再用LSTM/注意力。
- 训练监控:验证集F1值优先,不用单看准确率。
- 评估分析:混淆矩阵定位具体混淆对,反向指导特征设计。
- 部署适配:流式处理逻辑、模型轻量化、阈值调优、漂移监控。
一维数据分类这个领域,数据质量、数据划分和评估逻辑的重要性远大于模型架构本身。我在CWRU、HRRP、心电这三个差异巨大的场景里反复验证过同一个结论:把流水线基建做扎实,换什么信号来都稳。反过来,模型再花哨,划分一漏、评估一偏,全部等于零。如果你正在研究其中一个方向,建议先拿CWRU把流程跑通,再迁移到其他信号上,这套方法论通用性极强。