4、特征工程基础:特征提取、特征选择、特征降维

设备画像建得好不好,七成功夫在特征工程上。这话不是我说的,是干这行久了自然就明白的道理。你想想看,原始数据就像一堆没洗过的矿石,直接拿去建模,出来的东西肯定不靠谱。

我个人习惯把特征工程分成三步走:先提取,再选择,最后降维。每一步都有它的门道,咱们一个一个说。

4.1 特征提取:从原始数据里挖金子

特征提取,说白了就是把设备的各种原始信号转成有意义的数值。我见过不少新手,上来就把几十个传感器数据直接扔进模型,结果模型跑出来一团糟。

设备数据通常分三类:

  • 时域特征:均值、方差、峰值、均方根值
  • 频域特征:频谱能量、主频幅值、频率重心
  • 统计特征:偏度、峰度、百分位数

举个例子,我在处理风机振动数据时,光看原始波形根本看不出问题。但提取出均方根值和峰值因子后,轴承磨损的特征就非常明显了。

核心原则:特征提取不是越多越好,而是要跟设备故障机理对应上。你提取的特征如果跟物理规律没关系,那就是在制造噪声。

这里给一段简单的特征提取代码,用Python实现:

import numpy as np
import pandas as pd

def extract_features(signal, fs=1000):
    features = {}
    # 时域特征
    features['rms'] = np.sqrt(np.mean(signal**2))
    features['peak'] = np.max(np.abs(signal))
    features['crest_factor'] = features['peak'] / features['rms']
    
    # 频域特征
    fft_vals = np.fft.fft(signal)
    freqs = np.fft.fftfreq(len(signal), 1/fs)
    features['spectral_centroid'] = np.sum(freqs * np.abs(fft_vals)) / np.sum(np.abs(fft_vals))
    
    return features

小技巧:提取特征时,建议同时保留原始数据的采样频率和采集时间。我在项目里吃过亏,特征提取完忘了记录采样参数,后面做频域分析时全乱套了。

4.2 特征选择:去粗取精的艺术

特征提取完了,你可能得到上百个特征。但别高兴太早,这里面至少有一半是冗余的。特征选择就是帮你挑出真正有用的那部分。

常用的方法有三种:

方法类别 代表算法 适用场景 我的经验
过滤法 方差阈值、卡方检验 特征数量大,快速筛选 适合做第一道粗筛
包裹法 递归特征消除 特征数量适中,精度要求高 计算量大,但效果好
嵌入法 Lasso回归、随机森林 特征与模型一起优化 我最常用的方法

为什么会这样?因为不同方法看问题的角度不一样。过滤法只看单个特征跟目标的关系,包裹法看特征组合的效果,嵌入法则把特征选择嵌在模型训练里。

我曾经在一个设备故障诊断项目里,用随机森林的特征重要性排序,把200多个特征砍到只剩15个。模型精度反而从82%提升到了91%。你想想看,特征多了不一定是好事。

避坑指南:我曾经犯过一个错误——用全量特征训练模型,然后看特征重要性排序。结果模型过拟合严重,排序出来的特征全是噪声。正确的做法是先做交叉验证,再用验证集上的特征重要性做选择。

4.3 特征降维:化繁为简的智慧

特征选择和降维有什么区别?我打个比方你就明白了。特征选择是「挑水果」,从一堆水果里挑出好的。特征降维是「榨果汁」,把多种水果混合榨成汁,保留营养但形态变了。

降维的核心思想,就是把高维空间的数据映射到低维空间,同时尽量保留原始数据的结构信息。

常用的降维方法:

  • PCA(主成分分析):线性降维,保留方差最大的方向
  • t-SNE:非线性降维,擅长可视化
  • UMAP:兼顾全局结构和局部结构

我个人习惯在设备画像构建中优先用PCA。原因很简单:它计算快,结果可解释,而且对设备数据的线性结构保留得不错。

from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler

# 标准化很重要,不然量纲差异会主导主成分
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# PCA降维,保留95%方差
pca = PCA(n_components=0.95)
X_pca = pca.fit_transform(X_scaled)

print(f"原始特征数: {X.shape[1]}")
print(f"降维后特征数: {X_pca.shape[1]}")
print(f"各主成分方差解释率: {pca.explained_variance_ratio_}")

实用建议:做PCA之前一定要做标准化。我见过有人直接拿原始数据跑PCA,结果第一主成分完全被量纲最大的特征主导,失去了降维的意义。

4.4 三者的关系与选择策略

特征提取、选择、降维,这三者不是互斥的,而是可以组合使用的。我一般按这个流程走:

  1. 先提取:从原始数据中生成尽可能多的候选特征
  2. 再粗筛:用过滤法快速剔除明显无用的特征
  3. 后精选:用嵌入法或包裹法做精细选择
  4. 最后降维:如果特征维度仍然很高,用PCA做最终降维

下面这张图展示了整个特征工程的流程:

特征工程核心流程 原始设备数据 特征提取 特征选择 特征降维 最终特征集 注意事项 • 提取时保留物理意义 • 选择时避免过拟合 • 降维前必须标准化 • 三步可组合使用

嗯,这里要注意一点:不是所有场景都需要走完这三步。如果原始特征本来就不多,比如只有二三十个,那直接做特征选择就够了,没必要再降维。

4.5 实战中的避坑指南

做了这么多年设备画像,我总结了几条血泪教训:

  • 不要盲目追求特征数量:特征多不等于模型好。我见过有人提取了500多个特征,结果模型精度还不如用20个关键特征。
  • 注意特征的时间对齐:设备数据往往是时间序列,不同传感器采样频率可能不同。提取特征时一定要对齐时间戳,不然特征之间会有相位差。
  • 保留原始数据的备份:特征工程做完了,原始数据别删。我吃过这个亏,后来发现特征提取逻辑有bug,但原始数据已经清掉了,只能重新采集。
  • 特征工程要跟业务对齐:别光看统计指标,要跟设备工程师聊。他们知道哪些参数对设备状态最敏感,这些信息比任何算法都值钱。

总结一句话:特征工程不是纯技术活,它是技术跟业务经验的结合。你做的每一个特征选择,背后都应该有设备机理或业务逻辑支撑。这样建出来的设备画像,才真正能用、好用。