资讯动态

变压器DGA故障诊断数据集实战:从数据清洗到模型解释

发布时间:2026/10/13 19:12:36 来源:尧图企业网站定制
简介这份变压器溶解气体数据.rar面向电力设备运维、故障诊断研究与机器学习方向的科研人员和工程师提供实测的油中溶解气体分析样本用于识别中低温过热、高温过热、低能放电、高能放电、局部放电及正常状态六类典型工况。数据覆盖氢气、甲烷、乙烷、乙烯、乙炔等特征气体浓度可支撑比值法、判别函数法及智能诊断模型的训练与验证。压缩包约6.97MB文件总数与类型明细上游暂未提供解压后可直接用于数据分析与算法实验。目前已有177人学习下载适合需要真实样本开展故障分类、特征工程与模型对比的读者也可作为电力系统智能监控课题的验证数据帮助理解不同故障下气体生成规律为提前预警和运维决策提供依据。1. 变压器溶解气体数据.rar一份能直接跑故障诊断的数据集到底怎么用手里有一份变压器油中溶解气体分析DGA数据比拿到一堆论文PDF实在得多。变压器溶解气体数据.rar解压后是一组按样本组织的特征记录核心字段通常包括 H2、CH4、C2H2、C2H4、C2H6、CO、CO2 等气体浓度以及对应的故障类型标签。它解决的是电力设备状态监测里最典型的一类问题用油色谱数据判断变压器内部是过热、局部放电还是电弧放电。适合谁做电力设备故障诊断的研究生、搞在线监测系统的后端工程师、以及想拿真实工业数据练多分类模型的数据科学从业者。这份数据集不是玩具数据特征之间量纲差异大、类别不平衡、部分样本缺失正好覆盖从清洗到建模的完整链路。下面按“先看懂字段、再跑通基线、最后避坑”的顺序拆一遍。2. 字段解析与标签体系先搞清楚每一列在测什么2.1 七种特征气体的物理含义与量纲DGA 数据的每一列不是随便凑的每种气体对应变压器内部不同的绝缘材料劣化过程。H2 主要来自局部放电和水分分解CH4、C2H6、C2H4 是油裂解的产物温度越高 C2H4 占比越大C2H2 则是电弧放电的标志性气体CO 和 CO2 反映固体绝缘纸的老化。常见做法是把这些浓度统一到 μL/Lppm量纲但原始数据里经常混着 mg/L 或百分比直接喂模型会翻车。字段名含义典型量纲故障指示倾向H2氢气μL/L局部放电、水分CH4甲烷μL/L低温过热C2H6乙烷μL/L低温过热C2H4乙烯μL/L高温过热C2H2乙炔μL/L电弧放电CO一氧化碳μL/L固体绝缘老化CO2二氧化碳μL/L固体绝缘老化拿到数据第一件事不是画图是确认每列的量纲和有效范围。我一般会先跑一遍描述性统计看最大值有没有离谱到 10^6 级别如果有大概率是单位没统一。2.2 故障标签的编码方式与类别分布标签列通常用整数或字符串表示故障类型常见的有正常、中低温过热、高温过热、局部放电、电弧放电五类也有细分成七类的版本。关键问题是类别不平衡正常样本可能占一半以上电弧放电样本可能只有几十条。如果直接算准确率模型全预测“正常”也能到 60%所以评估指标必须换成宏平均 F1 或混淆矩阵。import pandas as pd # 读取解压后的数据文件假设为 csv 格式 df pd.read_csv(dga_data.csv) # 查看标签分布确认类别是否平衡 print(df[fault_type].value_counts()) print(df[fault_type].value_counts(normalizeTrue).round(3)) # 查看各气体字段的描述性统计排查量纲异常 gas_cols [H2, CH4, C2H6, C2H4, C2H2, CO, CO2] print(df[gas_cols].describe().T[[min, max, mean, std]])这段代码先看标签分布再看气体浓度的极值。如果某个气体最大值是 999999基本可以判定是缺失值填充或单位错误。参数上value_counts(normalizeTrue)给出的是占比比绝对数量更能反映不平衡程度。常见做法是当某一类样本少于总样本 5% 时建模阶段必须做重采样或类别权重调整。2.3 缺失值与异常值的处理边界工业数据没有不缺的。DGA 数据里常见三种缺失整行缺失、单字段为空、以及用 0 或 -1 填充的伪缺失。0 在气体浓度里是有物理意义的表示未检出但 -1 一定是填充值。处理策略上如果某行缺失超过三个气体字段我一般直接丢弃如果只缺一个用同类故障样本的中位数补。异常值方面C2H2 超过 1000 μL/L 的样本要单独看可能是电弧放电的真实高值也可能是录入错误不能一刀切用 3σ 删掉。import numpy as np # 将 -1 识别为缺失值 df[gas_cols] df[gas_cols].replace(-1, np.nan) # 统计每行缺失字段数 df[missing_count] df[gas_cols].isnull().sum(axis1) # 缺失超过3个字段的样本丢弃 df_clean df[df[missing_count] 3].copy() # 剩余缺失用同故障类型的中位数填充 df_clean[gas_cols] df_clean.groupby(fault_type)[gas_cols].transform( lambda x: x.fillna(x.median()) ) print(f原始样本数: {len(df)}, 清洗后: {len(df_clean)})这里的关键参数是missing_count 3这个阈值设太小会丢太多样本设太大会引入噪声。按经验七个气体字段里缺三个以内还能保留故障判别信息缺四个以上基本不可靠。分组填充比全局填充更合理因为不同故障类型的气体浓度基线本来就不同。3. 从原始浓度到诊断模型特征工程与基线跑通3.1 比值特征DGA 领域的经典做法直接用七个原始浓度喂模型不是不行但 DGA 领域几十年的经验都指向比值特征更稳。最经典的是三比值法C2H2/C2H4、CH4/H2、C2H4/C2H6 三组比值编码。还有 Rogers 比值和 Doernenburg 比值。这些比值的好处是能抵消绝对浓度受油量、采样时间影响的问题。我一般会在原始特征基础上把这几组比值作为额外特征拼进去让模型自己选。# 构造三比值特征加一个小常数避免除零 eps 1e-6 df_clean[R1] df_clean[C2H2] / (df_clean[C2H4] eps) # 乙炔/乙烯 df_clean[R2] df_clean[CH4] / (df_clean[H2] eps) # 甲烷/氢气 df_clean[R3] df_clean[C2H4] / (df_clean[C2H6] eps) # 乙烯/乙烷 # 总烃特征反映整体劣化程度 df_clean[total_hydrocarbon] ( df_clean[CH4] df_clean[C2H6] df_clean[C2H4] df_clean[C2H2] ) print(df_clean[[R1, R2, R3, total_hydrocarbon]].describe().T)eps取 1e-6 是为了防止分母为零工业数据里 H2 为 0 的情况不少见。三比值特征的取值范围可能跨几个数量级后续建模时要么做对数变换要么用树模型。总烃特征是个强先验很多故障类型在总烃上就有明显分层。3.2 标准化与对数变换的选型理由气体浓度分布通常是右偏的少数高值拉长尾巴。标准化Z-score对右偏数据效果一般对数变换后再标准化更合理。但注意对数变换要求所有值为正前面用中位数填充后不会出现零但如果有零值需要加 1 再取对数。我一般对原始浓度做log1p变换对比值特征做标准化因为比值本身已经去除了量纲。from sklearn.preprocessing import StandardScaler # 原始浓度做 log1p 变换 df_clean[gas_cols] np.log1p(df_clean[gas_cols]) # 比值特征做标准化 scaler StandardScaler() df_clean[[R1, R2, R3]] scaler.fit_transform(df_clean[[R1, R2, R3]]) # 确认变换后分布 print(df_clean[gas_cols [R1, R2, R3]].describe().T[[mean, std, min, max]])log1p等价于log(1x)在 x 接近 0 时数值稳定。标准化后的比值特征均值为 0、标准差为 1方便后续用 SVM 或逻辑回归。如果只用树模型随机森林、XGBoost标准化其实可以省但做了也不影响。3.3 基线模型随机森林与分层交叉验证跑基线不要一上来就上深度学习DGA 数据量通常几百到几千条树模型足够且可解释。用随机森林做五折分层交叉验证评估指标看宏平均 F1。分层是为了保证每折里各类别比例一致否则小类别可能在某一折里完全没出现。from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import StratifiedKFold, cross_val_score from sklearn.metrics import make_scorer, f1_score # 特征与标签 feature_cols gas_cols [R1, R2, R3, total_hydrocarbon] X df_clean[feature_cols].values y df_clean[fault_type].values # 随机森林基线 rf RandomForestClassifier( n_estimators300, max_depth8, class_weightbalanced, random_state42 ) # 分层五折交叉验证评估宏平均F1 cv StratifiedKFold(n_splits5, shuffleTrue, random_state42) scores cross_val_score(rf, X, y, cvcv, scoringmake_scorer(f1_score, averagemacro)) print(f宏平均F1: {scores.mean():.3f} ± {scores.std():.3f})class_weightbalanced让模型自动按类别频率反比加权缓解不平衡问题。max_depth8是防止过拟合的保守设置数据量小的时候树太深会记住噪声。宏平均 F1 对每个类别一视同仁小类别的表现不会被大类淹没。如果这个基线跑出来宏平均 F1 低于 0.7先回去检查标签编码和缺失值处理而不是急着换模型。4. 避坑与排查这份数据集最容易翻车的五个地方4.1 现象模型准确率很高但混淆矩阵里小类别全错原因类别不平衡加上用了准确率做评估指标。正常样本占多数时模型倾向于全预测正常准确率虚高。解决评估指标换成宏平均 F1 或平衡准确率建模时加class_weightbalanced必要时用 SMOTE 对少数类过采样。注意 SMOTE 只能在训练折里做不能在全量数据上做后再交叉验证否则数据泄漏。4.2 现象三比值特征出现 inf 或极端大值原因分母气体浓度为 0 或接近 0除零导致。解决加eps小常数或者改用对数比值log((aeps)/(beps))。如果某个比值超过 1000检查原始数据里对应气体是不是有录入错误。我一般会对比值特征做 1% 和 99% 分位数截断把极端值拉回合理范围。4.3 现象交叉验证得分波动特别大每次跑结果差很多原因数据量小折划分随机性影响大或者没设随机种子。解决固定random_state增加折数到 10 折或者用重复分层交叉验证RepeatedStratifiedKFold。如果波动仍然超过 0.1说明数据本身噪声大或样本太少这时候报告结果要带标准差不能只报一个均值。4.4 现象用原始浓度直接训练模型学到的全是总烃大小原因总烃浓度和故障严重程度强相关模型偷懒只用总烃一个特征就能分个大概但细分类别分不开。解决做特征重要性分析如果总烃重要性一枝独秀强制去掉它再训练逼模型学比值特征。或者用 PCA 白化后再看。常见做法是保留总烃但限制树的最大深度不让它过度依赖单一特征。4.5 现象换一批新数据后模型完全失效原因过拟合到训练集的量纲和分布没有做领域自适应。解决在新数据上先跑一遍描述性统计对比训练集的均值和方差如果偏移超过 20%用分位数归一化QuantileTransformer替代 Z-score。另外比值特征比原始浓度跨数据集更稳新数据上优先用比值特征做推理。5. 进阶技巧用 SHAP 解释模型并做单样本诊断跑通基线只是第一步实际工程里需要给运维人员解释“为什么判断这台变压器是电弧放电”。SHAP 是目前最实用的模型解释工具对树模型有精确的快速实现。下面这段代码在训练好的随机森林上算 SHAP 值并输出单个样本的特征贡献。import shap # 用全部数据训练最终模型 rf.fit(X, y) # 创建SHAP解释器树模型用TreeExplainer explainer shap.TreeExplainer(rf) shap_values explainer.shap_values(X) # 对第一个样本输出各特征对预测类别的贡献 sample_idx 0 pred_class rf.predict(X[sample_idx].reshape(1, -1))[0] print(f样本{sample_idx}预测类别: {pred_class}) # 取该样本对应预测类别的SHAP值 class_idx list(rf.classes_).index(pred_class) contributions pd.Series( shap_values[class_idx][sample_idx], indexfeature_cols ).sort_values(keyabs, ascendingFalse) print(contributions.head(6))shap_values是一个列表每个元素对应一个类别的 SHAP 矩阵。class_idx找到预测类别在列表中的位置。输出的贡献值正负表示该特征把预测推向该类还是推离。实际用的时候我会把 Top3 贡献特征和原始浓度一起打印出来给运维人员看“C2H2 偏高是判断电弧放电的主因”这种结论。还有一个实用技巧是阈值调优。默认的predict用 0.5 概率阈值但故障诊断里漏报代价远高于误报所以对电弧放电这类高危类别我会把阈值降到 0.3宁可多报也不漏。调阈值要在验证集上画 P-R 曲线找 F1 最大的点而不是拍脑袋定。从那以后我每次拿到新的 DGA 数据都强制先跑一遍量纲检查、标签分布和缺失统计这三步再动建模的念头。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑