变压器油色谱DGA数据建模实战:从数据清洗到故障诊断模型落地
简介这份变压器溶解气体数据集面向电力设备运维人员、故障诊断研究者及机器学习工程师用于支撑变压器故障识别与智能监控模型的开发验证。数据覆盖中低温过热、高温过热、低能放电、高能放电、局部放电与正常状态六类典型工况并围绕氢气、甲烷、乙烷、乙烯、乙炔等特征气体的浓度变化展开便于读者结合比值法与判别函数法开展特征分析与算法对比。资源以rar压缩包形式提供整体约6.97MB上游未返回文件总数与类型明细故不赘述具体构成。目前已有177人学习下载适合作为故障诊断建模、数据分析和算法验证的实测样本。读者可据此构建分类模型、复现气体比值判据、验证特征工程效果并对照不同故障类型的气体生成规律加深对变压器运行状态与潜在风险的理解为电力系统可靠性研究提供数据支撑。1. 变压器溶解气体数据.rar一份油色谱数据到手后先别急着训练模型拿到一个名为「变压器溶解气体数据.rar」的压缩包很多人的第一反应是解压、读表、丢进模型跑一遍准确率。我见过太多这样的流程最后卡在同一个地方数据里混着不同电压等级、不同取样周期、不同故障类型的记录标签还可能是「正常/注意/异常」这种粗粒度分级模型学到的其实是取样批次的分布而不是溶解气体和故障之间的物理关系。变压器油中溶解气体分析DGA本身是一套成熟的状态评估手段核心逻辑是绝缘油在过热或放电条件下裂解产生特征气体不同故障类型对应不同的气体组合与产气速率。这份数据要解决的就是把「气体浓度 → 故障类型/严重程度」这条映射做成可复现的建模流程。它适合两类人一类是做电力设备状态监测、想用真实油色谱数据验证特征工程和分类模型的人另一类是想把 DGA 从「看三比值表」升级到「批量筛查趋势预警」的运维工程师。前提是你得先接受一件事——这份数据不是拿来直接喂给神经网络的清洗和特征构造占掉七成工作量。2. 解压之后先做数据体检字段、量纲与标签分布2.1 先确认压缩包里到底是什么结构.rar本身只是容器里面常见的是 CSV、Excel 或者多个按年份/站点拆分的子表。不要假设字段名统一我一般先做一次目录扫描和编码探测避免后面读表时中文列名乱码。# 查看压缩包内文件清单不解压 unrar l 变压器溶解气体数据.rar # 解压到独立目录避免污染原始包 mkdir -p dga_raw unrar x 变压器溶解气体数据.rar dga_raw/ # 查看文件类型与编码Linux/macOS file dga_raw/*逻辑说明unrar l只列清单确认里面是单表还是多表unrar x保留目录结构解压。参数上如果压缩包有密码-p后接密码但多数公开数据集不带密码。解压后先别批量读用file看编码中文列名常见 GBK 和 UTF-8 混用这一步能省掉后面反复调encoding的时间。2.2 用 pandas 做一次字段体检DGA 数据的典型字段包括氢气 H2、甲烷 CH4、乙烷 C2H6、乙烯 C2H4、乙炔 C2H2、一氧化碳 CO、二氧化碳 CO2、总烃以及取样日期、设备编号、电压等级、故障标签。单位常见 μL/L即 ppm。先做缺失率、量纲范围和标签分布三件事。import pandas as pd import numpy as np df pd.read_csv(dga_raw/dga.csv, encodinggbk) # 1) 字段与缺失率 print(df.isna().mean().sort_values(ascendingFalse).head(10)) # 2) 量纲体检气体浓度不应为负总烃应约等于各烃类之和 gas_cols [H2, CH4, C2H6, C2H4, C2H2, CO, CO2] print(df[gas_cols].describe().T[[min, max, mean]]) # 3) 标签分布 if fault_type in df.columns: print(df[fault_type].value_counts(dropnaFalse))逻辑说明缺失率排序能快速定位是「整列缺失」还是「零星缺失」describe看最小值是否为负、最大值是否离谱比如 CO2 出现 10 万级可能是单位混用标签分布决定后面要不要做重采样。参数上encoding按上一步探测结果改GBK 读不了就换utf-8-sig。如果总烃和各烃类之和对不上说明有重复计数或单位不统一必须先修。2.3 标签粒度决定建模路线很多 DGA 数据的标签是「正常 / 注意 / 异常」三级也有的是具体故障类型过热、局部放电、电弧放电。三级标签适合做筛查模型具体故障类型适合做诊断模型。如果标签里混着两种粒度不要硬合并先按粒度拆成两个子任务。常见做法是先用三比值或大卫三角做一次规则基线再用机器学习模型对比提升幅度这样你能说清楚模型到底带来了多少增量。3. 特征工程从原始气体浓度到可解释的 DGA 特征3.1 三比值法的编码逻辑与实现三比值法是 DGA 里最经典的规则特征用 C2H2/C2H4、CH4/H2、C2H4/C2H6 三个比值编码成整数组合再查表对应故障类型。它的价值不在于多准而在于可解释、可复现适合作为基线特征。def ratio_code(row): # 三比值编码边界按常见工程阈值处理 r1 row[C2H2] / row[C2H4] if row[C2H4] 0 else np.nan r2 row[CH4] / row[H2] if row[H2] 0 else np.nan r3 row[C2H4] / row[C2H6] if row[C2H6] 0 else np.nan def code(v, t1, t2): if pd.isna(v): return -1 if v t1: return 0 elif v t2: return 1 return 2 return pd.Series({ code_r1: code(r1, 0.1, 3.0), code_r2: code(r2, 0.1, 1.0), code_r3: code(r3, 1.0, 3.0), }) df df.join(df.apply(ratio_code, axis1))逻辑说明三个比值分别对应不同故障的产气特征编码后组合成 0-2 的整数。参数上阈值t1/t2是工程经验值不同标准略有差异建议先按常见阈值跑通再在验证集上微调。注意分母为 0 的情况直接给-1表示无效不要用 0 填充否则会引入错误编码。3.2 产气速率与趋势特征单次取样只能看「当前状态」加上时间维度才能看「发展趋势」。如果数据里有设备编号和取样日期一定要构造产气速率特征相邻两次取样的浓度差除以时间间隔。df[sample_date] pd.to_datetime(df[sample_date]) df df.sort_values([device_id, sample_date]) for col in gas_cols: df[f{col}_rate] ( df.groupby(device_id)[col] .diff() / df.groupby(device_id)[sample_date].diff().dt.days )逻辑说明diff()算相邻差值除以天数得到每日产气速率。参数上如果同一设备同一天有多条记录先去重或取均值否则速率会失真。产气速率对局部放电和电弧放电的区分度往往比绝对浓度更高这是很多人忽略的一点。3.3 特征归一化与共线性处理气体浓度跨度大CO2 可能到几千C2H2 可能只有个位数直接进模型会被大尺度特征主导。常见做法是对数变换后再标准化同时检查总烃和各烃类的共线性。from sklearn.preprocessing import StandardScaler feat_cols gas_cols [code_r1, code_r2, code_r3] df[feat_cols] df[feat_cols].apply(lambda x: np.log1p(x.clip(lower0))) scaler StandardScaler() df[[c _z for c in feat_cols]] scaler.fit_transform(df[feat_cols])逻辑说明log1p压缩长尾clip(lower0)防止负值导致对数报错。标准化用fit_transform只在训练集上拟合验证集和测试集要用训练集的均值方差否则会数据泄漏。这一步是很多「离线准确率很高、上线就崩」的根源。4. 建模与验证别让随机划分骗了你4.1 按设备划分而不是按样本随机划分DGA 数据里同一台设备有多条记录如果随机划分同一设备的不同时间点会同时出现在训练集和测试集模型相当于「见过这台设备」准确率虚高。正确做法是按设备编号分组划分。from sklearn.model_selection import GroupShuffleSplit gss GroupShuffleSplit(n_splits1, test_size0.2, random_state42) train_idx, test_idx next(gss.split(df, groupsdf[device_id])) train_df df.iloc[train_idx] test_df df.iloc[test_idx]逻辑说明groups传设备编号保证同一设备只出现在一侧。参数上test_size按数据量定设备数少于 50 时建议用交叉验证而不是单次划分。这一步做完准确率通常会掉几个点但那个数字才是可信的。4.2 基线模型与对比先用逻辑回归或决策树做基线再用随机森林或梯度提升对比。不要一上来就上深度学习DGA 数据量通常不大树模型更稳。from sklearn.ensemble import RandomForestClassifier from sklearn.linear_model import LogisticRegression from sklearn.metrics import classification_report X_train train_df[[c _z for c in feat_cols]] y_train train_df[fault_type] X_test test_df[[c _z for c in feat_cols]] y_test test_df[fault_type] lr LogisticRegression(max_iter1000, class_weightbalanced) lr.fit(X_train, y_train) print(LR:\n, classification_report(y_test, lr.predict(X_test))) rf RandomForestClassifier(n_estimators300, class_weightbalanced, random_state42) rf.fit(X_train, y_train) print(RF:\n, classification_report(y_test, rf.predict(X_test)))逻辑说明class_weightbalanced处理类别不均衡DGA 数据里正常样本远多于故障样本。参数上n_estimators300 起步再大边际收益低max_depth不设时树会深建议用交叉验证调。看报告时重点看故障类的召回率漏报比误报代价高。4.3 用 SHAP 看模型到底学了什么树模型可解释性可以用 SHAP 值看特征贡献确认模型没有依赖设备编号或取样日期这类泄漏特征。import shap explainer shap.TreeExplainer(rf) shap_values explainer.shap_values(X_test) shap.summary_plot(shap_values, X_test, plot_typebar)逻辑说明TreeExplainer对树模型效率高summary_plot按特征重要性排序。如果排在前面的不是气体浓度或比值特征而是某个编码或日期衍生特征就要回头查数据泄漏。这一步是上线前的最后一道保险。5. 避坑与排查DGA 数据建模最常见的五个翻车点5.1 单位混用导致浓度量级错乱现象同一列气体浓度部分记录是 μL/L部分是 mg/L 或百分比describe里最大值和最小值差几个数量级。原因不同来源的数据表直接拼接没有做单位归一。解决先按设备或来源分组统计量纲确认单位后统一换算到 μL/L换算系数查标准不要凭感觉乘。5.2 标签泄漏用未来数据预测过去现象离线准确率 0.98上线后一塌糊涂。原因特征里混入了取样日期之后的记录或者用了全量数据做标准化。解决按时间切分训练/测试标准化只在训练集拟合产气速率特征确认只用了历史记录。5.3 三比值编码的边界陷阱现象模型对某些故障类型完全无召回。原因三比值阈值设得太死边界附近的样本被编码到错误区间。解决把编码从硬阈值改成模糊隶属度或者直接把原始比值作为连续特征输入模型让模型自己学边界。5.4 缺失值填充引入偏差现象填充后模型在缺失率高的设备上表现差。原因用全局均值填充忽略了设备差异。解决按设备分组填充或者把「是否缺失」作为一个二值特征加进去让模型知道这条记录的信息完整度。5.5 类别不均衡下的准确率幻觉现象准确率 0.95但故障类召回率不到 0.3。原因正常样本占绝大多数模型全预测正常也能拿高准确率。解决看混淆矩阵和每类召回率用class_weight或重采样评估指标换成宏平均 F1 或故障类召回率。6. 把模型变成可复现的筛查流程一个最小落地技巧前面几章把数据体检、特征工程、建模验证和避坑都过了一遍最后一章落到一个具体技巧怎么把整个流程封装成一条命令能跑通的筛查脚本方便后续换数据、换阈值、换模型时快速复现。我一般会写一个run_dga.py把配置抽成字典数据路径、特征列表、模型类型、评估指标都从配置读这样下次拿到新的.rar只需要改配置不用动代码。# run_dga.py import yaml import pandas as pd from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import GroupShuffleSplit from sklearn.metrics import f1_score def load_config(pathconfig.yaml): with open(path, r, encodingutf-8) as f: return yaml.safe_load(f) def main(): cfg load_config() df pd.read_csv(cfg[data_path], encodingcfg[encoding]) # 特征与标签 feat_cols cfg[feature_cols] label_col cfg[label_col] group_col cfg[group_col] # 按设备分组划分 gss GroupShuffleSplit(n_splits1, test_sizecfg[test_size], random_state42) train_idx, test_idx next(gss.split(df, groupsdf[group_col])) train_df, test_df df.iloc[train_idx], df.iloc[test_idx] model RandomForestClassifier( n_estimatorscfg[n_estimators], class_weightbalanced, random_state42, ) model.fit(train_df[feat_cols], train_df[label_col]) pred model.predict(test_df[feat_cols]) score f1_score(test_df[label_col], pred, averagemacro) print(fmacro F1: {score:.4f}) if __name__ __main__: main()配套的config.yaml长这样data_path: dga_raw/dga.csv encoding: gbk feature_cols: - H2_z - CH4_z - C2H6_z - C2H4_z - C2H2_z - code_r1 - code_r2 - code_r3 label_col: fault_type group_col: device_id test_size: 0.2 n_estimators: 300逻辑说明配置和代码分离换数据只改 YAMLGroupShuffleSplit保证设备不跨集f1_score用宏平均避免类别不均衡下的准确率幻觉。参数上n_estimators和test_size是最常调的两个前者影响训练时间后者影响评估稳定性。这个脚本不追求一步到位它的价值在于把「数据体检 → 特征 → 划分 → 模型 → 指标」这条链路固定下来后面每次迭代只改一个环节能清楚知道是数据变了还是模型变了。我自己的习惯是拿到任何一份 DGA 数据先跑一遍这个脚本拿到基线 macro F1再决定要不要加特征、换模型。如果基线已经够用就不折腾如果不够至少知道差距在哪。血泪经验是很多翻车不是因为模型不够强而是因为划分方式错了、单位没统一、或者标签本身就有问题。把这三件事先做对比换十个模型都管用。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

CFSFDP参考代码实战:密度峰值聚类原理、决策图与调参指南

CFSFDP参考代码实战:密度峰值聚类原理、决策图与调参指南

简介:资源内含CFSFDP算法的Python参考代码,面向数据挖掘与聚类分析方向的学习者与研究人员,适用于包含离散、连续及模糊属性的复杂数据集,主要解决模糊数据分区前的特征选择与降维问题。压缩包共7个文件,约12KB&#x…

2026/10/13 15:27:06 阅读更多 →
【血糖】患者血糖数据、PID反馈控制和食物的切换,模拟混合人工胰腺Matlab实现

【血糖】患者血糖数据、PID反馈控制和食物的切换,模拟混合人工胰腺Matlab实现

✅作者简介:热爱科研的Matlab仿真开发者,擅长数学建模、模型改进、算法创新、程序设计科研仿真。🍎 往期回顾关注个人主页:完整代码获取 定制创新 论文复现私信🍊个人信条:做科研,博学之、审问之…

2026/10/13 15:27:06 阅读更多 →
ROSTCM6中文分词与词频统计实操:从编码清洗到内容分析

ROSTCM6中文分词与词频统计实操:从编码清洗到内容分析

简介:这是由武汉大学沈阳教授研发的免费社会计算平台ROSTCM6,主要面向人文社科领域的师生与研究者,解决文本内容分析与量化研究中的分词、词频统计、情感挖掘等需求。工具覆盖微博分析、聊天分析、全网分析、网站分析、浏览分析、流量分析、聚…

2026/10/13 15:27:06 阅读更多 →

最新新闻

MySQL 4.0 实战指南:老版本环境搭建、避坑与迁移要点

MySQL 4.0 实战指南:老版本环境搭建、避坑与迁移要点

简介:《MySQL 4.0.pdf》是一份聚焦MySQL 4.0版本的开源关系型数据库参考资料,适合数据库管理员、后端开发人员及系统学习数据库原理的读者,用于理解经典版本的功能体系与运维思路。资源为单个PDF文件,压缩包仅334KB,内…

2026/10/13 16:17:31 阅读更多 →
C++刷题指南:双指针反转、区间反转与原地扩容的字符串三题精讲

C++刷题指南:双指针反转、区间反转与原地扩容的字符串三题精讲

最近又刷了一轮力扣字符串题,把 344、541 和一道很经典的“替换数字”放到一起过了三遍。这三题单独看都不难,C 解法也都不超过 30 行,但把它们串在一起刷,你会发现它们正好覆盖了字符串操作中最容易被忽略的三类基本功&#xff1…

2026/10/13 16:17:31 阅读更多 →
Linux VFS核心架构深度拆解:从root device报错到数据落盘

Linux VFS核心架构深度拆解:从root device报错到数据落盘

前阵子帮朋友调一块嵌入式板子,内核起来后卡在了一行红字上:VFS: Cannot open root device "ram" or unknown-block(1,0): error -6折腾了一下午,最后发现只是内核配置没开 ramdisk 驱动,外加启动参数里 root 写得太想当…

2026/10/13 16:17:31 阅读更多 →
Cocos Creator房卡麻将源码拆解:状态机、洗牌算法与胡牌判断实战

Cocos Creator房卡麻将源码拆解:状态机、洗牌算法与胡牌判断实战

简介:一套基于CocosCreator引擎开发的房卡麻将棋牌游戏完整源码,面向Cocos Creator游戏开发者与棋牌类项目学习者。该项目围绕房卡模式展开,覆盖玩家创建私密房间、邀请好友开局、房卡购买与发放等核心链路,可作为从零搭建棋牌游戏…

2026/10/13 16:17:30 阅读更多 →
Linux VFS虚拟文件系统:从启动报错到架构与实战剖析

Linux VFS虚拟文件系统:从启动报错到架构与实战剖析

1. VFS到底是什么:从一次启动报错说起如果你玩过Linux内核开发或者自己折腾过嵌入式系统,大概率遇到过这么一行让人血压升高的日志:VFS: Cannot open root device "ram" or unknown-block(1,0): error -6 Please append a correct …

2026/10/13 16:17:30 阅读更多 →
基于SpringBoot+Vue的西安旅游系统管理平台设计与实现

基于SpringBoot+Vue的西安旅游系统管理平台设计与实现

每年到这个时间点,总有不少同学私信问我同一个问题:毕设选题到底选什么,既能赶紧把东西做出来,又不至于在答辩的时候被问得哑口无言。如果你正在发愁这件事,那这套基于SpringBootVue的西安旅游系统管理平台&#xff0c…

2026/10/13 16:16:29 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →