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这样经典稳健的分类器,已经能取得令人满意的识别效果。相反,如果把大量精力花在堆叠复杂的深度学习模型上,在小样本的局部放电场景里往往适得其反,训练时间成倍增加,识别效果却未必更好。
最后分享一个小技巧:做特征优选时不要把目光只盯在最终准确率上,也要关注优选特征的物理意义是否合理。一个典型的例子是,如果最终优选出的特征里包含了放电脉冲上升时间,那么这个模型的可靠性会更高,因为上升时间与物理放电机制直接相关,而不只是数据的统计巧合。把一个数据驱动模型往物理合理性上靠一靠,往往能让它在未知工况下保持更稳定的表现。