变压器局部放电模式识别:特征提取、优选与SVM分类实践
1. 为什么给变压器做“放电体检”难点全在识别上干过电力设备状态检测的人都知道变压器最怕的不是过负荷而是绝缘系统里那些细小的、断断续续的局部放电。油纸绝缘是大型油浸式变压器的核心绝缘结构一旦内部出现气泡、杂质、受潮或者尖刺局部电场畸变到一定程度就会产生局部放电。短期看它可能只是微弱的放电脉冲但长期下来绝缘材料会被逐步腐蚀、碳化最后发展成贯穿性击穿。换句话说局部放电是绝缘劣化的“早期病灶信号”能在故障爆发前捕捉到它的类型和趋势比等着变压器烧了再修要主动太多。这个项目属于典型的信号处理与模式识别交叉应用技术链路并不复杂但每一步都有讲究。简单来说就四件事先把放电信号采下来然后从信号里提取能反映放电本质的特征再从一堆特征里优选出区分度最好的一批最后交给分类器去判别放电类型。听起来和做语音识别、图像分类的套路很像但局部放电信号有自己的脾性它不是平稳信号幅值分布跨度极大现场干扰又多处理起来比一般振动信号麻烦不少。这篇内容适合两类人看一类是做电气设备状态检修的工程师想在传统阈值报警之外再往细里走一步另一类是信号处理方向的研究生需要把特征提取、特征选择、模式识别这套方法落地到具体工程问题上。文中所有实操细节都基于实验室中常见的四种放电缺陷模型尖刺放电、悬浮放电、气隙放电、沿面放电展开后面提到的思路和代码结构可以直接移植到自己的实验数据上。2. 特征提取从放电脉冲波形里捞出“指纹”局部放电特征提取是整个识别链路的基石这个环节出的特征质量直接决定后面特征优选和分类器能达到什么上限。特征不是越多越好但一开始一定要尽可能把不同角度的信息都提出来先广撒网后面再用优选算法去筛。2.1 时域统计特征最直观的放电“性格”时域特征是一组围绕放电脉冲波形形状、极性、幅值分布的基本统计量。包括放电幅值的均值、峰值、方差、偏度、峭度、正负半周不对称度等。这些特征刻画的是放电过程的宏观统计行为。偏度反映放电幅值分布是否对称。比如尖刺放电通常在负半周幅值大偏度会明显偏向一侧而气隙放电正负半周比较对称偏度接近零。峭度则描述放电幅值分布的“尖锐程度”悬浮放电由于放电次数少但单次能量集中往往会在脉冲幅值维度呈现出很高的峭度。相位相关特征也在时域这一大块里。工程上最常用的是PRPD谱图也就是把每个放电脉冲根据它的工频相位、放电幅值和放电次数绘制成三维谱图。从PRPD图里可以提取放电峰值的相位区间、正负半周相位分布差异、平均放电量等特征。这套特征对区分放电类型非常有效因为不同缺陷对应的放电相位区间差异实在是太明显了。尖刺放电多发生在电压峰值附近气隙放电集中在相位过零附近并向峰值方向延伸沿面放电则在电压上升沿和下降沿都有分布。时域这块还有一个小众但好用的特征放电脉冲的上升时间和持续时间。用示波器更高带宽采样时不同类型放电的脉冲前沿时间常数会有差异。气隙放电的脉冲前沿通常在纳秒级别而沿面放电的脉冲上升沿较缓。这类协波形特征可以作为辅助判据但要注意它对采样率要求高现场如果采样频率不够提取出来反而误导分类器。2.2 频域与时频域特征捕捉非平稳细节局部放电信号是典型的非平稳瞬态信号单纯看时域波形只能看到“发生了什么”看不见信号内部不同频率成分的分布和变化规律。把放电信号做FFT可以得到频谱。不同放电类型的频谱能量集中区域有差异比如悬浮放电通常在频域上有较宽的频带成分而气隙放电的频率成分相对集中。但是经典的FFT只能给出全局频率信息无法同时刻画时间与频率的对应关系这对于瞬态局放信号来说信息损失比较严重。时频分析在这方面有优势。常用工具包括短时傅里叶变换STFT、小波变换和经验模态分解EMD。小波变换是处理局放信号最成熟的手段之一因为它能同时在时域和频域上定位瞬态信息。实操中常见做法是先用小波包对原始放电信号做三层或四层分解得到不同频带的能量系数然后计算各频带能量占比作为特征向量。不同放电类型在不同频带上的能量分布差异能明显区分出来。EMD方法这两年也有人在用它把信号自适应地分解成若干个本征模态函数IMF再提取各IMF的能量矩、瞬时频率特征。好处是不需要预先选定基函数适应性比小波强但缺点是分解层数不稳定工程落地时重复性稍差需要配合总体平均经验模态分解EEMD来抑制模态混叠。就我自己的实验经验来说把时频域特征作为辅助特征加入模型能提升识别率但完全依赖时频域特征去替代时域统计特征是不明智的信息冗余度高而且计算代价偏大。2.3 统计参数与图谱特征PRPD里的玄机前面提到PRPD谱图这里再展开一点。PRPD谱图在局部放电模式识别里几乎是必做的特征来源业界公认它是局部放电“指纹”的代表性形式。从PRPD谱图里可以提取两类特征。第一类是图谱的统计形状特征包括放电相位分布的正负半周偏度差、峭度差、相位不对称度、互相关系数等。第二类是把PRPD谱图当作图像提取图像的矩特征、纹理特征。比如灰度共生矩阵GLCM的能量、对比度、相关性和熵以及Hu矩等图像形状特征。这些图像特征把放电相位分布的形状差异量化成了数值对区分不同类型的放电有奇效。我做过一次对比实验只用了PRPD图像纹理特征加上一个结构相对简单的分类器识别率就能做到90%以上。这说明PRPD图谱确实是区分放电类型的“主战场”。但要注意的是实验室提取PRPD谱图用的是干净的模拟放电信号现场数据往往混有大量干扰需要先做干扰抑制。常见做法是加带通滤波和相位同步累加抑制周期性干扰后再生成PRPD谱图。否则特征里混着干扰信息后面再怎么优选都救不回来。2.4 特征池构建先广撒网再优中选优建议建一个相对完善的特征池包含3个层次的特征来源时域统计量、频带能量与时频联合特征、PRPD图谱特征。特征总数控制在30到60个左右。为什么是这个范围太少的话容易缺失区分某些放电类型的关键信息比如只用时域特征不同放电类型的重叠度较高太多的话又引入冗余和噪声特征分类器的训练和泛化都会受影响而且计算量上升明显。在做特征池时要留意特征单位不统一的问题时域特征的量纲是mV频域能量特征量纲各异图像特征的数值范围可能从几到几万分类器对这些非常敏感。后面做模式识别之前必须做归一化或者标准化处理这几乎是所有做信号识别项目的人都会踩的坑。3. 特征优选为什么特征多反而更糟糕特征池构建完之后如果不做优选直接喂给分类器通常会得到一个让新手摸不着头脑的结果特征越多识别率反而越差。这就是所谓的“维数灾难”。局部放电特征尤其如此因为很多特征之间高度相关比如放电幅值均值和放电能量之间就有很强的线性关系相位不对称度和正负半周偏度差之间也有信息重叠。说白了特征池里一大半特征可能是“重复信息”甚至“噪声信息”。特征优选要解决的根本问题只有一个从几十个特征里找到一组数量少、区分能力强、彼此互补的特征组合。它跟降维不同。降维如主成分分析PCA是把原始特征变换到新的低维空间新特征失去了物理含义特征优选是从原始特征里直接挑选子集保留下哪些特征在物理上可解释。对于变压器状态检测这类工程应用特征可解释性非常重要——调试完成后现场工程师宁可相信“放电幅值偏度PRPD相位不对称度某个频带能量占比”这样看得懂的组合也不放心一组经过了数学变换的抽象分量。3.1 过滤式方法ReliefF与mRMR的取舍过滤式特征选择是相对快速的方法不依赖具体分类器直接用某个评价指标给每个特征打分排序选出分数靠前的特征。常见的评价指标有方差阈值、相关性、互信息等。ReliefF是这一族中很受欢迎的一种。它根据特征对“同类样本”和“异类样本”的区分能力来打分。具体实现逻辑是对于每个样本找到同类中最近的几个邻居和异类中最近的几个邻居统计某个特征在这两组邻居上的差异差异越大说明该特征对区分类别的贡献越大。Matlab内置了relieff函数可以直接调用非常方便。mRMR最大相关最小冗余是另一种思路。它不仅要选那些与类别标签相关性强的特征还要保证选出的特征之间彼此相关性尽量小。这个思想很对路它在“单个特征有用”和“组合特征不啰嗦”两个目标之间做了平衡。mRMR没有内置在Matlab基础工具箱里需要自己写代码不过逻辑清晰、代码量不大十几行就能实现一个离散版本的mRMR。从实际效果看ReliefF适合先做粗筛把特征从五十个砍到二十个左右mRMR适合在粗筛的基础上做精选逐步挑选出十个以内的核心特征。这两者的组合是我在项目中反复尝试后觉得最稳定的方案。3.2 包裹式与嵌入式分类器反馈带来更好效果如果你对识别率有比较高的要求或者实验数据本身区分度一般可以考虑包裹式方法。它的思想是把分类器当作黑盒用分类器的识别准确率当评分函数让算法在特征子集空间里搜索。典型算法有基于遗传算法的特征选择、基于序列前向选择SFS和序列后向消除SBE的搜索。包裹式方法的优点是效果通常比过滤式好因为它直接以“最终目标”作为优化对象。缺点是计算开销很大。每评估一个特征子集就要训练一次分类器。如果样本量几百个、特征量几十个SFS跑个几百次训练还能接受如果再叠加上交叉验证时间成本就上来了。我一般只在数据量不大几百个样本的情况下使用包裹式方法做最终确认。嵌入式方法则是把特征选择嵌入到分类器训练过程中。典型代表是L1正则化逻辑回归和决策树类的特征重要性排序。如果你最终决定用随机森林做分类器它的feature importance输出本身就是一种嵌入式特征评价。3.3 优选结果怎么验证才靠谱选完特征之后最重要的一步是验证优选结果确实有效而不是靠感觉说“看起来不错”。标准做法是做一个对比实验统一使用同一分类器分别在原始全特征集和优选特征子集上做交叉验证对比识别率和计算耗时。这里有一个容易被忽略的细节特征选择过程必须在训练集内部完成而不能在所有数据上完成后再切训练验证集。否则会引入“信息泄漏”导致测试结果虚高。具体操作为先把数据划分为训练集和测试集在训练集上做特征优选确定特征子集再把这个子集套用到测试集上做评估。过程中的每一轮交叉验证也要在训练集内部重新做特征优选。我自己在项目中踩过这个坑。第一次跑实验时贪图方便先在全部数据上做了ReliefF筛选再切训练和测试集结果测试准确率高了五个百分点。当时还有点高兴后来意识到这是典型的信息泄漏重新按上述流程跑了一遍准确率虽然降了一些但模型的真实可信度更高了。4. 模式识别算法选型与Matlab实现细节特征优选完成后分类器选型没有想象中那么挑剔只要不是太差的分类器在优选特征支持下都能获得不错的识别效果。这也侧面说明特征工程比算法调参更重要。但不同分类器在计算速度、可解释性、对小样本数据的适应能力上还是有明显差别的。4.1 为什么首选SVM支持向量机SVM在局部放电模式识别里应用最广原因很简单局部放电样本通常是小样本几十到几百个样本而SVM在小样本高维分类上非常稳健。它的分类决策只依赖支持向量而非全部样本在小样本下不容易过拟合。在Matlab里实现SVM分类非常方便。多分类问题建议用fitcecoc它内部会采用一对多或一对一策略把多分类问题拆分成多个二分类问题逐个解决。RBF核函数是最常用的选择核尺度参数用优化器自动搜索即可。通过实测发现在相同的特征子集下SVM的识别率通常比BP神经网络高几个百分点而且训练时间短得多。BP神经网络需要精细设计隐藏层结构、调节学习率、控制过拟合调参工作量较大。SVM需要调整的核心参数只有惩罚系数和核函数参数配合Matlab的优化工具可以较快确定。4.2 随机森林作为对比与验证随机森林也是一个值得尝试的方案。它天然支持多分类对特征尺度不敏感这意味着即使你忘了归一化随机森林也不太会给你难堪。同时它能输出特征重要性排序这些重要性分数可以和前面ReliefF、mRMR的结果相互验证。如果ReliefF认为某个特征重要随机森林的特征重要性排序里它也位居前列那么这个特征大概率是真正有用的。在Matlab里用TreeBagger可以实现随机森林也可以直接使用fitcensemble搭配Bag集成方法。随机森林对超参数不太敏感主要调整的是树的棵树。从几百棵开始往上试到一千棵左右识别率变化就不大了。随机森林的缺点是模型体积较大预测速度比SVM稍慢在离线诊断场景下无所谓但在实时在线监测场景下需要考虑这个因素。4.3 Matlab代码框架让整个流程跑起来完整的Matlab实现建议按模块组织保持每一步的可视化和可调试性。下面给出一个我在项目中验证过的基本框架。首先数据加载和标签定义。用表格形式存储样本每一行是一个放电样本前若干列是特征最后一列是类别标签。% 加载特征数据 data readmatrix(features.csv); features data(:, 1:end-1); labels data(:, end); % 划分训练集与测试集 rng(42); cv cvpartition(labels, HoldOut, 0.3); trainIdx training(cv); testIdx test(cv); X_train features(trainIdx, :); y_train labels(trainIdx); X_test features(testIdx, :); y_test labels(testIdx);然后是特征优选环节。先用Matlab内置的ReliefF做一轮过滤式粗筛再根据mRMR做精筛。% ReliefF粗筛 [ranked, weights] relieff(X_train, y_train, 10); % 取前20个特征 top20 ranked(1:20); % 在粗筛基础上用mRMR精筛mRMR函数需自行实现 selected mrmr(X_train(:, top20), y_train, 8); selectedFeatures top20(selected);这里需要强调的是在筛选特征时只使用X_train数据不能提前看到测试集。mRMR函数如果手写的话核心步骤是循环计算每个候选特征与已选特征之间的冗余度以及该特征与类别之间的相关性然后选出相关性大而冗余度小的特征。代码大概三四十行即可完成。特征筛选完成后进入分类器训练和评估。用fitcecoc构建SVM模型然后做交叉验证。% 使用筛选后的特征 X_train_sel X_train(:, selectedFeatures); X_test_sel X_test(:, selectedFeatures); % 归一化处理 mu mean(X_train_sel); sigma std(X_train_sel); X_train_norm (X_train_sel - mu) ./ sigma; X_test_norm (X_test_sel - mu) ./ sigma; % 训练SVM多分类器 svmModel fitcecoc(X_train_norm, y_train, ... Learners, templateSVM(KernelFunction, rbf, KernelScale, auto)); % 交叉验证 cvModel crossval(svmModel, KFold, 5); cvAccuracy 1 - kfoldLoss(cvModel); fprintf(交叉验证准确率: %.2f%%\n, cvAccuracy * 100); % 测试集评估 pred predict(svmModel, X_test_norm); testAccuracy sum(pred y_test) / length(y_test); fprintf(测试集准确率: %.2f%%\n, testAccuracy * 100);最后一步输出混淆矩阵和各类别的精确率、召回率。只看总准确率会掩盖某些类别的识别问题特别是不同放电类型样本数量不平衡时个别类别可能被分类器忽略掉。% 混淆矩阵 confMat confusionmat(y_test, pred); % 计算各类别精确率和召回率 precision diag(confMat) ./ sum(confMat, 2); recall diag(confMat) ./ sum(confMat, 1); fprintf(各类别精确率: %s\n, mat2str(precision)); fprintf(各类别召回率: %s\n, mat2str(recall));整个流程跑下来从加载数据到输出评估指标代码量在100行左右。结构上强烈建议把特征提取、特征优选、分类评估分别写成函数方便后续换分类器或者换特征池时只改一小块代码。5. 实战踩坑记录与排查技巧这个项目实操过程中有几个坑是反复出现的几乎每个新接手的人都会踩一遍。我把它们记录下来希望能帮后面的人少走弯路。5.1 样本不平衡个别放电类型识别率惨不忍睹实验室采集的四种放电缺陷样本数量通常不均等。尖刺放电最常见、也最容易激发样本数量可能远多于悬浮放电。如果不加处理地直接训练SVM分类器会偏向样本数量多的类别悬浮放电的识别率就会很低。解决办法有两个方向。一个是数据层面做重采样对少数类做SMOTE过采样或者对多数类做欠采样另一个是算法层面调整分类权重在fitcecoc中通过cost矩阵或者Prior参数指定类别先验概率让分类器对少数类的错误分类给予更高惩罚。优先推荐调整先验概率改动小且不过度改变数据分布。5.2 归一化的时序问题测试集信息泄漏的隐蔽来源归一化同样存在信息泄漏问题。要先用训练集的均值和标准差去标准化测试集而不是用全量数据的统计量也不是各自分别标准化。前面代码里已经体现了这一点。如果你把测试集也纳入均值和标准差的计算测试集的分布信息就被偷看了一部分评估出来的准确率会偏高。这看起来是小细节但在论文评审或工程验收阶段如果被问起数据处理的每个步骤这个细节是能体现水平的。5.3 模型过拟合的排查思路局部放电模式识别的小样本高维特性十分容易过拟合。判断技巧很简单如果训练集准确率接近100%而测试集准确率显著低于训练集比如差5个百分点以上就要警惕过拟合。排查时先看特征优选环节是否引入了信息泄漏其次检查是否有某个特征在类别间几乎无区分度却因为随机噪声被选中最后可以降低分类器复杂度例如增大SVM的RBF核尺度参数正则化强度调高看测试集效果是否反而变好。如果变好说明模型确实过拟合了。5.4 现场干扰对特征提取的致命影响实验室条件下采集的特征提取方法直接套用到现场数据上往往识别率会断崖式下跌。现场环境中的电晕干扰、开关操作暂态、谐波噪声等都会污染放电信号。特征提取之前最好加一个前置的干扰抑制模块比如用小波变换做去噪、用相位开窗剔除周期性干扰或者用脉冲波形特征做聚类分离。在文章层面能做到的是建模时留一部分带噪样本作为测试数据检验模型在干扰环境下的鲁棒性。如果模型在干净样本上识别率很高但混入带噪样本后识别率明显下降说明特征池里缺少抗干扰能力强的特征或者去噪模块效果不达标需要回到特征提取环节重新补强。6. 一点个人体会在多次做完这个项目流程后我的体会是局部放电模式识别真正的难点不在分类器选得多高级而在特征层面的信息挖掘是否到位。一个精心构造的特征池加上一套可靠的特征优选流程配合SVM这样经典稳健的分类器已经能取得令人满意的识别效果。相反如果把大量精力花在堆叠复杂的深度学习模型上在小样本的局部放电场景里往往适得其反训练时间成倍增加识别效果却未必更好。最后分享一个小技巧做特征优选时不要把目光只盯在最终准确率上也要关注优选特征的物理意义是否合理。一个典型的例子是如果最终优选出的特征里包含了放电脉冲上升时间那么这个模型的可靠性会更高因为上升时间与物理放电机制直接相关而不只是数据的统计巧合。把一个数据驱动模型往物理合理性上靠一靠往往能让它在未知工况下保持更稳定的表现。