资讯动态

配电主站日志异常检测数据集构建全流程详解

发布时间:2026/10/16 2:06:55 来源:尧图企业网站定制
搞配电主站日志分析的同行应该都体会过那种“日志天天有翻的时候想撞墙”的感觉。故障发生的时候海量正常记录把真正的异常信号淹没在底下一个控制器反复重启、一条通道几分钟内连续断开又恢复、某一路遥控总是在同一秒报返校超时……单独看每一条都是不起眼的小事放在一起就是设备劣化或者网络不稳定的早期信号。去年我在整理某套配电主站系统的运行日志时索性把这些数据系统性地整理成了一份可供算法训练和评测的配电主站日志异常检测数据集。这篇文章就把整个构建过程摊开来讲日志从哪些环节来、异常类别怎么定义、标注怎么做、异常检测算法怎么在数据集上评测以及那些只有实际动过手才会遇到的坑。对做电力数据分析、日志异常检测算法研究或者想给配网自动化系统加一套智能告警能力的人来说这份实践记录应该有直接的参考价值。1. 配电主站日志的源头先搞清楚数据是从哪几个环节冒出来的1.1 主站日志的六类主要来源配电主站不是一台机器而是一套由前置采集、应用服务、数据库、Web发布、安全审计等多个节点组成的系统。日志散布在各个环节源头不一样格式和语义差异也很大。我当时梳理下来大致可以分成六类日志类别产生位置典型内容对异常检测的价值系统运行日志应用服务器、前置机服务启停、进程崩溃、CPU/内存告警高直接反映主站自身健康度通信报文日志前置采集模块104规约收发、通道状态切换、超时重连高配网终端通信中断的直观证据告警/遥信日志告警服务、SCADA应用SOE事件、遥信变位、越限告警、保护动作高能发现一次设备异常信号操作日志调度操作工作站遥控分合、遥调、对点试验、人工置数中高能发现误操作和异常频率操作安全审计日志认证网关、堡垒机登录成功/失败、权限变更、越权访问中主要支撑安全类异常数据库日志数据库服务器慢SQL、死锁、连接数耗尽中数据库问题往往被忽略很多人做日志异常检测时只盯住告警日志这是不够的。配网故障往往是“通信先断、遥信后变、操作再失败”这种链条式的表现单看一类日志根本拼不出完整画面。我在构建数据集时坚持把六类日志都纳入采集范围交叉关联之后很多异常的根因才浮出水面。1.2 一条日志长什么样格式差异比想象中更大举两个真实的例子。第一条是典型的告警日志2024-06-15 14:23:11.582 | WARNING | ALARM | 101#间隔 | 过流I段动作 | PS_101_L1_O | 动作 | 1 | 0 | 故障遥信第二条是某前置模块的通信日志[14:23:12.004] [INFO] CHN: 0002, 主备通道切换, 主: 192.168.10.21:2404 - 备: 192.168.10.22:2404, 原因: T1超时, 重连次数: 3看到问题了吗时间戳格式不同、字段分隔符不同、设备标识不规范一会儿叫“101#间隔”一会儿在别的地方写“P_101_L1”、中英文混杂。把这些数据灌给模型之前必须做字段抽取和格式统一这一步不做干净后面所有工作都是白搭。1.3 为什么配电主站日志异常检测比IT系统日志更难IT领域的日志异常检测已经很成熟了但直接搬到配电主站会很不适应原因有三个第一数据量级虽然不及互联网但杂度高。一套中型配网主站一天产生几万到几十万条日志不算大但六类日志混在一起、模板五花八门解析成本远高于统一格式的IT系统日志。第二正负样本极度失衡。正常日志可能占99%以上真正算得上异常的不足1%。更麻烦的是“异常”并不是一个单一类别——通信重连、遥控失败、遥信抖动、数据库慢查询各自的特征完全不同硬塞进二分类会让模型学得四不像。第三上下文比单条内容更重要。很多异常是“一段时间内反复出现”的模式而不是“某一条内容明显不对劲”。比如通道在5分钟内重连了20次单看每一条重连日志都是正常格式连起来看就是通信链路劣化。所以这个数据集在构建时我特别强调了会话窗口和事件序列的切分方式这一点后面细说。2. 异常分类体系给日志打标签前先定义清楚什么叫“异常”2.1 按根因划分的六类异常做数据集绕不开标签体系。我一开始也想简单粗暴地标“正常/异常”但做了一周就发现不可行——不同来源的异常形态差异太大二分类标签根本训不出有区分度的模型。最后和几位有经验的调度运维人员反复讨论按根因把异常分成六类通信类异常通道频繁中断、重复重连、规约解析错误、T0/T1/T2超时。特征是周期性或突发性常见于站所终端与主站之间的链路问题。设备状态类异常进程反复重启、CPU/内存持续高位、磁盘空间写满、时钟失步。特征是持续恶化趋势比如某服务从一天重启1次变成一小时重启3次。遥信遥测类异常遥信频繁变位抖动1秒内多次翻转、遥测越限、数据跳变、死数据长时间不变。这类数据能反映一次设备状态也能暴露采集回路问题。遥控操作类异常遥控返校超时、执行失败、同一间隔短时内重复操作、操作人与间隔不匹配。这类异常极少但影响大直接关联到操作安全和设备健康。安全类异常非授权访问、短时间内多次登录失败、越权执行命令、账号异常锁定。数据库类异常慢SQL、死锁、连接池耗尽、备份任务失败。这类往往被忽略但主站卡顿、遥信刷新延迟的根因经常在这。每个大类下面我还细分子类并用代码编号比如“通信类-通道中断-C1”“通信类-重连风暴-C2”。实际标注时先标大类再标子类能大幅降低标注员的认知负担也方便后续做细粒度评测。2.2 影响等级异常检测不能只看类型还要看严重程度六类异常之间没有可比性一次遥控失败比一次通道重连严重得多所以数据集里每条异常样本还带一个影响等级等级定义典型实例L1 紧急可能导致遥控失败、数据中断或主站功能不可用通道全部中断、数据库死锁、进程崩溃L2 重要能明显反映设备劣化需要尽快处理重连风暴、遥信频繁抖动、慢SQL持续增长L3 一般单次影响有限但多次出现需关注单次登录失败、单次超时、偶发优先级告警L4 提示不直接影响业务可记录观察时钟偏差小、例行操作记录这个等级在设计评估指标时非常有用。比如我做基线评测时会把L1和L2的召回率单独拉出来看比全局F1更有工程意义——毕竟漏掉一个L1的代价可能顶得上误报几百条L3。2.3 标签结构设计成什么样每条日志样本的标签最终设计成这种结构label_typenormal或anomalyanomaly_class上述六类根因之一正常样本则为空anomaly_subclass子类编号severityL1到L4source_type日志来源通信、告警、操作、安全等这么做有一个额外好处可以按不同粒度切出子集做实验。比如只挑“通信类异常”训练一个专用检测器或者只对L1L2样本评测模型的高危场景效果。3. 数据集构建的核心流程从原始日志到一份能训练能评测的语料3.1 采集窗口设计别只取“故障那天”的日志我见过不少团队做数据集时专门挑故障前后的日志结果模型在“故障场景”上表现很好一上生产就垮——因为正常模式的多样性严重不足。我这次采集了整整十二周的日志覆盖了三个完整自然月。选这个窗口不是拍脑袋是因为它覆盖了迎峰度夏负荷波动、一次计划检修、两起雷雨天气跳闸、若干次例行遥控操作既有密集故障段也有长时间风平浪静的日常段。正常样本的多样性和异常样本的覆盖率同等重要。3.2 数据脱敏第一周就做别等录入一半才补配电主站日志里有大量敏感信息运维账号、工作站IP、网段、设备资产编号、操作人标识甚至偶尔出现的明文口令片段。我一开始图快没做统一脱敏等标注了一部分才返工结果要把对应字段重来一遍教训挺深刻。后来定下三条规则操作人姓名/工号替换为匿名编号U001、U002……映射表单独加密保存且不随数据集发布。IP地址按网段掩码处理保留段内相对关系比如保留“192.168.x.x”的第三段隐藏最后一段。设备资产编号哈希化同时保留间隔逻辑名如101#间隔因为间隔维度对异常分析有意义。注意凡是可能定位到具体设备、具体人员、具体地点的信息发布前一律脱敏。这个红线不能碰宁可损失一部分分析粒度也不能带出真实身份信息。3.3 清洗与标准化把“八国联军”变成统一格式清洗这一步我分成四道工序去重。同一事件在多个日志文件中重复记录比如告警库和报文日志同时记录同一次通道中断按“时间戳±5秒事件特征”做近似去重但保留重复计数作为特征字段因为重复出现的次数本身就是信号。字段抽取。用正则从原始文本中抽取出结构化字段时间、来源模块、事件类型、目标设备、动作结果、重连次数、耗时等。抽不出来的部分保留为raw_text不强行丢弃。时间戳归一化。统一到毫秒级、统一时区、统一格式为YYYY-MM-DD HH:mm:ss.SSS。这一步不做按时间排序和窗口切分都会出错。编码统一。把混杂的GBK和UTF-8文本统一转为UTF-8乱码记录单独标记并从训练样本中剔除但保留在原始数据里备查。清洗完的日志每条都维护成JSON结构。核心是下面这样的形式{ timestamp: 2024-06-15 14:23:11.582, source: alarm_service, event_type: protective_trip, device: INT_101, message: 过流I段动作101#间隔, session_id: SES_20240615_1423_001, raw_text: 2024-06-15 14:23:11.582 | WARNING | ALARM | 101#间隔 | 过流I段动作 | PS_101_L1_O | 动作 | 1 | 0 | 故障遥信, label: { label_type: anomaly, anomaly_class: 遥信遥测类, anomaly_subclass: T2_保护动作, severity: L2 } }这里多出来的session_id是会话窗口标识。我按5分钟固定窗口加连接会话两种方式切分目的就是让模型能看到“上下文片段”而不是孤零零的一条日志。3.4 标注规范与一致性控制多人标完才知道多难对齐标注是整个流程里最容易被低估的一步。我把标注流程设计成“两轮标注专家仲裁”第一轮由三名标注员背靠背独立标注每人拿到的是同一批样本但互不知道其他人的结果。标注选项不是简单的“正常/异常”而是先判断是否异常再选异常类别和等级拿不准的标“不确定”。第二轮对比三人的结果两两计算一致性指标。对一致率低于阈值的样本抽出来重新讨论统一判断口径。当时最典型的争议出现在“遥信抖动”和“正常变位”的边界上有些间隔在检修期间频繁变位属于正常流程但在运行期间同样频率变位就是异常。后来我们约定必须结合同期检修计划表做标注凡是检修窗口内的操作类变位一律视为正常。这种领域知识如果没有沉淀成标注规则模型学到的一定是脏标签。3.5 数据切分按时间切不按随机切训练集、验证集、测试集怎么划分直接决定评测结果可信度。我见过有人直接train_test_split(random_state42)这在日志数据上是错误的——相邻时间段的日志高度相似随机切分会把同一事件的碎片同时塞进训练集和测试集指标虚高得离谱。最终我按时间顺序切前8周做训练集第9到10周做验证集最后2周做测试集。测试集是模型完全没见过的“未来数据”这样评测结果才接近线上真实表现。4. 用自己的数据集跑异常检测方法路线和评测基线的经验4.1 日志解析和特征提取模板抽取这一步绕不开日志文本不能直接灌进模型。我先把训练集日志做了模板抽取把类似“通道0002主备切换”这种高频模式归并为事件模板给每个模板一个ID然后把原始日志变成事件序列事件ID: 104_CHN_SWITCH, 窗口内出现次数: 7, 间隔秒数均值: 32.5 事件ID: 104_RE_ATTACH, 窗口内出现次数: 3, 间隔秒数均值: 120.3特征方面我用了三组统计特征窗口内事件种类数、各事件频次、事件序列熵、重连次数均值、超时占比。时序特征事件间隔的均值/方差/极值、窗口间频次差分。文本特征对无法模板化的raw_text做TF-IDF向量化。这套特征组合对通信类和遥信类异常非常有效。重连风暴的典型特征是104_RE_ATTACH频次突增且间隔均值骤降在统计特征上非常明显一个孤立森林就能抓到。4.2 检测方法从规则基到深度学习分层上看我用自己的数据集跑了三种路线作为基线供大家参考规则基线。把调度值班规则转成正则和阈值条件比如“5分钟内重连次数5”“同一间隔10分钟内遥控失败2次”。可解释性最好但覆盖率有限很多“没见过的新异常”漏掉。传统机器学习。孤立森林和One-Class SVM在“频次突变型”异常上效果不错训练快、CPU就能跑适合做第一道粗筛。问题是对“单条内容怪异但频次正常”的异常比如某条规约报文结构异常几乎无感。深度方法。我试过基于Transformer序列建模事件序列以及日志自编码器重构误差两种做法。前者效果上限高能在更长的上下文中捕捉异常模式但对数据量和算力要求更高训练也更容易过拟合——毕竟配电主站样本量相比互联网级别还是小。我自己实际部署时采用的是“分层级联”先用规则过滤掉已知高频异常再用机器学习模型捕捉未知异常深度模型做第二道复核。这样既保证精度又不至于让告警系统变成“黑盒”。4.3 评测指标准确率在这个场景里是个陷阱异常样本占比不到1%时模型全部判正常也能有99%准确率所以准确率完全不参考。我建议用这套指标组合指标关注点用法建议Precision / Recall查准与查全的权衡运维场景建议重点看召回率宁可多误报也不要漏重大异常F1 / F0.5综合平衡F0.5更偏精度F1更偏召回个人更推荐F1PR-AUC阈值无关的整体能力如果你想调阈值这个指标最直观高等级样本召回率评估对L1/L2异常抓得全不全这是我最看重的一个指标我跑孤立森林基线时的实测印象是通信类异常召回率能做到80%以上但安全类异常召回率不到40%——因为安全异常在正常样本里太稀薄特征不够突出。这说明单模型打天下不现实分类别评测、分类别建模的路子更有价值。5. 构建过程里踩过的坑和后续维护思路5.1 四个实打实的坑第一个坑是脱敏做晚了。前面提过返工成本极高。现在回头看第一周就该把字段规范、脱敏脚本、样例数据版本一起定好而不是等清洗完再考虑。第二个坑是过度标注。标注员面对不确定样本时倾向于标成“异常”而不是“不确定”因为人总觉得“标正常可能漏掉问题”。这直接污染标签。后来我强制规定拿不准的必须标“不确定”宁可样本少一点也不能让噪声混进训练集。第三个坑是随机划分导致的指标虚高。这个前面已经详细说过时间切分虽然会牺牲一点指标数值但换来的是可信度非常值。第四个坑是一刀切删除设备标识。刚开始做脱敏做的太狠把所有间隔名、设备名全部替换成统一占位符结果模型完全丧失设备维度特征。后来改成“哈希化但保持同一设备前后一致性”模型学到的信息量立刻不一样了。5.2 数据集版本管理与持续更新配网设备在改造、终端在增加、主站版本在升级日志模板和异常模式都会漂移。一次性的数据集用不了太久我建议按“数据版本”管理每次新增批次数据版本号递增如v1.2、v2.0并记录数据采集时段、覆盖站点数、新增异常类别。模型评测结果必须标注对应的数据版本否则不同版本之间对比没有意义。每隔一段时间做一次“异常模式增量分析”看训练集中未出现过的新日志模板判断是否需要补充标注。我自己的习惯是每季度更新一次数据版本同步重跑基线模型观测指标变化。虽然麻烦但这是让异常检测系统不腐烂的唯一办法。5.3 发布格式的一点建议数据集发布时除了原始JSONL样本我强烈建议额外附带三样东西事件模板表把高频日志模板和对应事件ID列出来方便别人直接做事件序列建模。字段说明和标注规则文档说明每个字段的含义、取值枚举以及标注共识比如检修窗口内变位视为正常。没有这份文档别人拿到数据也玩不转。基线脚本和评测脚本固定评测指标和切分方式让后来者能在同一把尺子下比较效果。这些配套材料花的时间不多但价值不比数据本身小。数据集不是“把文件打包发出去”就完事能用、能用得起来、能比较才算一份合格的数据集。整个过程做下来我最大的体会是配电主站日志异常检测的核心难点根本不在算法而在数据和工程侧。日志源杂乱、标签定义模糊、异常模式依赖领域知识这些问题的解决程度直接决定模型上限。如果重做一次我会第一周就把脱敏脚本、字段规范和标注手册三样东西先定稿再开始大规模清洗和标注。最后再分享一个小技巧发布数据时把会话窗口的事件序列也同步导出成序列样本很多人拿到原始日志后卡在“怎么把单条日志组装成事件序列”这一步你要是在发布时就帮他们解决了这份数据集的实用价值至少翻一倍。

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

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

免费获取报价 →
↑