本节摘要:原始时间序列数值通常不足以直接喂给检测模型,特征工程是把"一段序列"变成"模型能消化的特征矩阵"的桥梁。本节详解滞后特征、统计特征、时域/频域特征三大类特征的构建方法与适用场景,再讲过滤式、包裹式、嵌入式三类特征选择策略的权衡。核心结论:特征不是越多越好,冗余特征会稀释信号、拉高噪声,特征选择与特征构建同样重要。
阅读完本节,你应当能够:
两个工程师在给同一个设备故障检测系统做特征。甲把能想到的指标全塞了进去:原始值、上一时刻值、上上个时刻值、一小时均值、一小时方差、一小时最大、最小、昨天同时刻值、上周同时刻值……一共 87 列特征。乙只选了 8 列:滞后 1、滞后 12(对应每小时周期)、滑动 1 小时均值、滑动 1 小时标准差、当前时刻与昨日同时刻的差值、残差的 Z-score。
模型跑完,乙的准确率反而更高,训练快 5 倍,而且每一列特征都能跟工程师解释清楚。
这个结果一点都不反直觉。特征工程的核心不是"加得越多越好",而是"每一列都得对应一个可解释的信号来源"。 冗余特征有三个危害:一是稀释了真正有判别力的信号——当 87 列里只有 8 列有用时,模型要花大力气从噪声列里挣扎出来;二是引入多重共线性,让模型对噪声敏感;三是维度灾难——特征越多,同样样本量下模型越难收敛。
时序特征工程还有一层独特难度:原始点值本身往往不是最好的特征。 设备是否异常,更多体现在"变化率""与同时段历史的关系""局部波动模式"上,而不是"当前值是多少"。所以这一节的核心任务,是学会把时间信息转换成判别信息。
滞后特征是最直观的时序特征:用 x(t-k) 作为 x(t) 的特征。逻辑基础就是第 1 章讲的"时间依赖"——过去的值包含预测现在的信息。
滞后阶数怎么定? 三个来源:
构建示例: 序列 [1,2,3,4,5,6,7,8,9,10],取滞后 1 和滞后 2:
| 时间点 | x(t) | x(t-1) | x(t-2) |
|---|---|---|---|
| 2 | 2 | 1 | — |
| 3 | 3 | 2 | 1 |
| 4 | 4 | 3 | 2 |
| ... | ... | ... | ... |
| 10 | 10 | 9 | 8 |
两个坑:滞后阶数选少了漏信息,选多了引入噪声并制造维度灾难;对非平稳序列,直接取滞后值会被趋势主导——先差分或分解再做滞后。
统计特征用一个滑动窗口内的统计量概括局部形态:均值、标准差、方差、中位数、最小值、最大值、四分位数、偏度、峰度,以及移动平均、EWMA。
时域特征直接在原始序列上算:
频域特征先把序列变换到频率域:
频域特征的价值在于揭示隐藏的周期性——比如振动信号里"某个频率分量能量骤升"往往是故障指纹。代价是计算量大、解释性差。工程上常见做法:用频域做探索、定周期,用提炼后的主频/频带能量作为特征,而不是把整条频谱喂给模型。
| 特征类型 | 捕捉的信息 | 构建要点 | 典型应用 |
|---|---|---|---|
| 滞后特征 | 自相关结构、短期记忆 | 阶数靠 ACF/PACF/领域知识 | 预测残差类方法输入 |
| 统计特征 | 局部中心、波动、分布形态 | 窗口匹配异常时间尺度 | 大多数机器学习检测 |
| 时域特征 | 变化率、强度、频率密度 | 差分、能量、过零率 | 突变检测、信号分析 |
| 频域特征 | 周期性、频带能量 | FFT → PSD → 主频 | 振动、声学、周期性故障 |
特征构建完,下一步是"做减法"。三类方法:
过滤式(Filter):与模型无关,先按统计指标筛。相关系数(与目标线性相关)、互信息(信息共享量)、方差阈值(移除近常量的列)。优点是快,缺点是忽略特征间组合效应。
包裹式(Wrapper):把特征子集选择当成搜索问题,反复用模型评估子集性能。递归特征消除 RFE(逐个移除最不重要特征)、前向/后向选择。优点是效果通常更好,缺点是计算开销大。
嵌入式(Embedded):把选择内嵌进模型训练。L1 正则化(Lasso 会把不重要的系数压成 0)、树模型的特征重要性(随机森林、梯度提升树天然给出重要性排序)。工程上最常用,性价比最高。
选特征的四条原则:相关性(选与目标相关的)、重要性(选对性能贡献大的)、冗余性(剔除强相关的重复列)、解释性(尽量保留能讲清业务的)。
给大多数时序检测任务,这个组合作为起点性价比很高:
这个组合覆盖了"水平、波动、周期性、相对偏离"四类信息,且每一列都能解释。先跑起来,再根据漏报案例逐步加特征。
特征工程的产出不是"越多越全的特征表",而是"每一列都对应一种可解释的判别信号"。加一列之前先问:这个特征在区分"异常/正常"上有什么逻辑依据?答不上来的特征,大概率只是噪声。
⚠️ 常见坑:把大量滞后特征和原始值一起直接喂树模型/线性模型,忽视多重共线性。 滞后 1 和滞后 2 高度相关时,线性模型系数不稳定、可解释性崩塌。先看相关性热图,砍掉冗余列。
💡 关键直觉:特征工程的本质是"把时间结构翻译成判别结构"。 原始值里看不出的信息,藏在变化率、周期相对量、频带能量里。翻译得好,简单的模型也能打;翻译不好,再强的模型也是巧妇难为无米之炊。
特征方案要和检测方法一起设计:树模型(Isolation Forest、随机森林)对特征尺度不敏感、能处理非线性,适合统计/频域混合特征;线性/距离类模型要求特征标准化;深度模型则更偏好"端到端自己学特征"——这就是第 6 章用深度模型时往往"少做手工特征"的原因。特征工程的工作量,应该按检测方法的"自主特征学习能力"来分配。
某水厂给取水泵房做异常检测,第一版只用了两个特征:当前流量值和流量的滑动均值。检测结果误报率居高不下——因为"当前流量"在白天取水高峰和夜间低峰数值差异巨大,模型把"高峰时段的正常高流量"全当成了异常。第二版加了三类特征:滞后 24 小时的同时段流量(消除日周期)、当前流量与同时段的差值(凸显偏离)、滑动窗口标准差(捕捉波动异常)。误报率下降了一半以上,因为模型终于"看见"了日周期——它学会了"同这个时刻比,而不是和全天平均值比"。
这个案例的启示:时序特征工程的第一优先级,永远是"把周期性转成可比较的相对量"。 差分、同期差值、周期内位置(一天中的第几小时)这类特征,是让模型理解"上下文"的关键,也是把第 1 章"上下文异常"变成"可检测信号"的桥梁。
除了前文提到的问题,再补充三个高频坑:一是时间泄漏——用了"未来"的信息当特征(比如用整段序列的全局均值当特征,而这个均值包含了检测点的未来),会让评估虚高、上线翻车;二是特征与标签泄漏——把"是否异常"相关的结果直接编进特征;三是忽略窗口边界效应——滑动窗口在序列开头缺数据,要用填充或收缩窗口处理。这三条坑里,时间泄漏最隐蔽也最致命,务必在构造特征时就检查清楚。
先做统计特征(窗口均值/标准差),再做滞后特征。因为统计特征已经概括了"局部形态",滞后特征补充"与过去的直接关系"。两个都不复杂,但统计特征对窗口尺度更敏感,先把它定好。
对线性/距离类模型是必须的(量纲差异会让大数值特征主导);对树模型不是必须(树只看分裂阈值,不受单调变换影响)。深度模型基本必须标准化。 不知道用哪个,先标准化,损失可忽略。
先用"嵌入式"方法(树模型特征重要性 / Lasso)粗筛一遍,保留重要性前 20 名;再人工检查保留的特征里有没有明显冗余(相关性 >0.9 的留一个);最后用递归特征消除精调到目标数量。三步下来,通常能砍掉一半以上的特征。
多半是加了冗余或噪声特征,把原有信号的判别力稀释了。加特征之前先问:这个特征在区分异常/正常上有什么逻辑依据? 答不上来的特征,大概率是噪声。
下一章我们站到高处,把统计、机器学习、深度学习、集成四大家族画成一张全景图——先知道有多少种刀,再谈哪把刀切什么。