核数聚这个项目,说实话最开始并没有叫这么正式的名字。当时就是工厂给我们提了一个需求:要把设备监测、工艺参数、质检记录这些数据统一起来,做成一份"能喂给模型"的东西。等我把现场数据拉出来一看,才发现这事远比想象的麻烦。同一台设备,PLC里存的时间戳格式和SCADA里不一样,温度和压力字段有的叫temp、有的叫T、有的干脆就叫value,还有一大批数据在导出时单位都丢了。三周时间,大部分都耗在跟老师傅对口径上。回头再看整个流程,真正拉开差距的环节,就是工业数据集标准化。这篇就把核数聚项目的全流程拆开讲清楚:从原始数据接入到标准化层、服务层、数据集市,再到质量验证和踩坑经验,给正准备做工业数据集的人一份可以直接对照执行的参考。
1. 工业数据集标准化:为什么听起来简单,做起来天天想放弃
1.1 工业数据的"出身"决定了它天然不适合直接建模
很多从互联网转来做工业数据的人,刚接触到现场数据都会很不适应。互联网日志虽然杂乱,但它本质上是给人或系统看的结构化文本,字段含义大体明确。工业数据完全不是这样,它的来源极其分散:PLC里跑的是控制逻辑产生的实时值,SCADA系统按秒或毫秒采一轮快照,MES里记录的是工单和生产批次,ERP管的是物料和库存,车间还有一堆纸质巡检表最终被录入成Excel。这些系统彼此独立运行了十几年,从来没有人为"后续做分析"设计过数据格式。
这还没算最要命的时间同步问题。现场设备的时钟经常不准,有的设备快两分钟,有的慢半分钟,好几套系统的服务器时间各自为政。做时间序列分析的时候,最常见的办法是拿时间戳直接对齐,但工业数据里"同一秒"在不同系统里可能差了整整几十秒。时间一旦对不上,聚合出来的特征就是错的,后面建模再怎么调参也救不回来。
用个生活化的类比:互联网日志像是记者统一采访后写出的稿件,格式工整、口径清楚;工业数据则是车间老师傅随手记的维修笔记,字迹潦草、术语混用,但信息量巨大。老师傅自己看得懂,可换了别人就完全懵了。数据标准化要做的,就是把这些"笔记"整理成一本有目录、有体例、可检索的手册。
1.2 行业里最常见的三种"伪标准化"
这些年看下来,很多团队宣称自己在做数据标准化,但实际上只是做了表面功夫。我把它们归纳成三种典型的"伪标准化",供大家对照自查。
第一种是"只改字段名"。把device_name改成deviceName,把temprature改成temperature,觉得命名统一了就算标准化。这种做法的确解决了一部分问题,但它没有触及数据的本质。字段名改了,单位不一样照样不一样,编码规则不统一照样不统一,模型训练的时候照样出问题。
第二种是"只做格式转换"。把CSV转成Parquet,把Excel导入数据库,就宣布数据已经标准化了。格式统一只是第一步,离真正的标准化还差着十万八千里。转换完之后字段里存的还是那种随便填的文本值,比如故障代码有的写E001,有的写01,有的干脆写"电机故障",统计起来一对不上。
第三种是"照搬互联网数仓套路"。数据湖、数据仓库、宽表大模型使劲往上套,层数拆得很漂亮,但根本没有考虑工业场景的特殊性——设备型号要维护、点位要映射、工况要区分、量纲要换算。工业数据标准化必须贴近机理,照搬其他行业的模型只会让体系变得又重又空,最终没人维护。
这里我想提一下嘉立创在BOM标准化审查上的思路。BOM就是物料清单,里面的元器件型号、封装、位号、用量、单位任何一个字段不一致,采购和贴片环节都会出大问题。嘉立创做的标准化审查,核心动作是让物料的每个维度都可枚举、可校验、可追溯——型号走标准库,封装走标准库,单位有固定选项,审查不通过直接拦截。工业数据集标准化本质上也是同一件事:给数据里的每一个关键维度建立统一的参照体系,让每一条数据都能被规则校验,让每一次校验都有迹可循。它不是一次性的改名,而是一套持续运行的规则机制。
2. 我在核数聚项目中选用的三层数据架构,从harmonized到serving再到data mart
2.1 为什么坚持保留原始层
核数聚项目在做架构设计时,团队里有过不少争论。一部分人认为直接按照业务需求建模就行,不用搞那么复杂;另一部分人主张参考数据仓库的分层思路。最后我拍板采用了一套偏保守的三层架构,最底下额外保留一个原始接入区。
我始终坚持一个原则:原始数据是资产,解析后的数据是产品。原始数据永远不能丢,也永远不能修改。原因有两个。第一,工业现场的很多数据是不可再生的。设备卖掉、产线改造、系统升级之后,历史数据就再也采不回来了。原始数据一旦弄脏或搞丢,损失无法挽回。第二,工业项目都有追溯和审计的硬需求。模型效果出了问题,迟早要回溯到原始数据上去排查,如果只保留处理后的数据,中间的任何一步都说不清楚。
所以在核数聚里,原始接入区的数据是只读的,落盘之后任何人都不能做变更。常见的做法是保留原始文件加上一层校验哈希,谁要动数据,先过审计。这一层看起来不起眼,但后期排查问题的时候,它省了我太多的时间。
2.2 harmonized层的"标准化"到底标准什么
标准化层是整个架构里最核心的一层,这一层做不好,后面的服务层和数据集市都是空中楼阁。很多人以为标准化就是统一字段命名,其实远远不止。我在核数聚里梳理了五个必须标准化的维度:
- 命名规则:表名、字段名、文件名都遵循同一套命名规范。表名用
主题_分层_粒度的格式,比如equip_harmonized_sensor表示设备主题下标准化层的传感器明细表。字段名统一小写下划线风格,禁止同一个含义用不同名字。 - 时间格式:全部统一成ISO 8601标准,统一到毫秒级精度,时区统一记录为UTC+8或同时保留原始时区偏移。时间字段固定为三件套:
event_time(业务时间)、ingest_time(接入时间)、batch_id(批次号)。仔细体会一下这三者的差异:业务时间是现场实际发生时刻,接入时间是数据落库时刻,批次号是数据链路识别号。很多排查场景,缺了任何一个都很难定位问题。 - 单位制:所有物理量统一使用国际单位制,温度用开尔文或摄氏度并显式标注,压力用帕斯卡,长度用米。单位必须在元数据里明确记录下来,不允许出现"约定俗成"的情况。后面我会讲一个因为单位没统一导致模型翻车的案例。
- 设备标识:每台设备必须有全局唯一的设备编码。核数聚用的是
厂区_产线_工序_工位_设备类型_序号的层级编码规则,例如A01_L02_CT01_MT03_PLC_001。这样做的好处是,光看设备号就能知道它属于哪个厂区、哪条产线、哪道工序,对跨工厂的分析特别友好。 - 枚举值字典:所有状态码、故障码、工艺类型等枚举字段,全部映射到统一的代码字典。现场原来的故障码五花八门,映射后就只有一套标准代码,字典的版本号要记录在元数据里,方便追踪映射规则的演变。
在这一层,我还会基于现场实际的BOM表、设备点检表和工艺参数表,构建一份"字典表集合",而不是靠人的记忆去维护规则。字段能引用字典的绝不手写,这跟嘉立创BOM标准化审查的思路一致:所有可枚举的维度都走标准库,宁可前期多花时间建字典,也不要后期一条条去改数据。
2.3 serving层与data mart数据集市的边界划分
标准化层解决的是"数据变得一致"的问题,但它还不够好用,因为数据仍然分散在各个主题表里,业务人员取数要自己join很多张表。于是我在这之上又做了服务层(serving)和数据集市(data mart)。
服务层的定位,是把标准化层的数据按照业务过程重新组织成"开箱即用"的宽表。比如设备开机过程分析,需要把设备运行状态、工艺参数、环境条件、操作记录等拼到一起,服务层就直接产出这样的宽表,口径在服务层里固化下来,下游任何团队拿到这张表,得到的统计结果都是一样的。这解决的是"同一份报表,两个部门算出来的数字不一样"的经典矛盾。
数据集市则是按照分析主题来组织的,比如设备健康主题、质量追溯主题、能耗优化主题。它更贴近具体业务场景,可以针对特定模型做特征工程,甚至可以允许一定的数据冗余。打个比方,标准化层像是中央厨房统一备好的净菜,服务层是分装好的半成品套餐,而数据集市则是按照不同菜系搭配好的成品宴席。数据集市只服务特定的分析目标,不追求大而全。
这里有一个实践经验:很多人会把服务层当数据库乱建宽表,一张serving表几十甚至上百个字段,什么业务都往里塞,最后维护成本极高。我的做法是给serving表的字段数画一条红线,超过一定数量就说明边界不清,必须拆表。数据集市里再为特定的模型做裁剪和派生,这样每一层各司其职,链路才是健康的。
3. 怎样制作工业数据集:从采集、清洗到标注的完整链路
3.1 采集阶段:点位表就是第一份数据字典
很多人做数据集动手就写采集脚本、拉数据、搞清洗,结果做到一半发现现场哪个表没有、哪个字段缺失、哪个设备根本没数据,返工量巨大。我在核数聚里的经验正好相反:采集之前先花大力气做点位盘点。
点位表是工业现场最重要的元数据文件,它记录了一台设备上有哪些采集点、每个点的信号类型、单位、量程、所在系统、所属工序等信息。可惜绝大多数工厂点位表都散落在不同的工程师手里,有的在PLC程序注释里,有的在Excel里,有的甚至只在老师傅脑子里。核数聚项目专门用一周时间,把几条产线的点位全部重新梳理了一遍,做成了统一格式的点位字典。
点位字典里每个点位至少包含这些字段:点位编码、点位名称、设备编码、信号类型(AI/DI/DO/PI等)、工程量单位、量程下限、量程上限、采集方式、采样频率、所属系统。有了这份字典,后续数据接入时才能判断哪些数据是有效范围,哪些值明显超限需要重点关注。
采样频率的问题也要在这里一并确认。有些数据源可以做到毫秒级采集,有些只能隔几秒采一次,如果不做记录,后面做时间对齐会非常痛苦。我的建议是不要盲目追求高频,要结合分析目标来确定:做振动分析至少需要几千赫兹,做温度趋势几秒钟采一次就足够了。高频数据量大了存储和计算都是成本,采集之前先想明白"这个量测值最终要回答什么问题"。
3.2 清洗:哪些数据能修,哪些只能删
数据清洗不是把脏数据"擦干净",而是先判断脏数据能不能修,修不了的只能删或标脏。这个判断本身就依赖前面建立的字典和规则。
数值型数据的检查一般分三步走。第一步是上下限检查,超出量程范围的值直接标记异常;第二步是跳变检测,比如温度在1秒内从20度跳到200度,就算没有超量程也极不可能是真实测量值;第三步是死值检测,长时间恒定不变的值很可能是传感器故障,这类数据在统计特征里会造成很大的误导,必须剔除或标脏。
时间对齐是另一个高频操作。不同系统采样间隔不一样,有的1秒一次,有的30秒一次,对齐时我建议先按统一频率重采样,再处理缺失窗口。短时间缺失可以用前向填充,但连续缺失超过一定阈值(比如超过完整周期的10%),就不能再填了,只能把该区间整体置为缺失并记录原因。这里要特别说一句:对生产过程数据保留缺失区间的标记,有时比用插值填满更有价值。模型如果知道"这段数据是缺失的",往往比拿到一段幻觉出来的假数据判断得更准确。
至于清洗时遇到的最麻烦问题——停机数据怎么处理,我的建议是不要一刀切。一个批次里设备中途停机了几分钟,这几分种到底算正常工艺还是异常工况,取决于你的分析目标。做故障预测时停机段是重要的负样本;做产能统计时停机段的处理方式又不一样。所以清洗脚本里要保留原始标签,同时增加一个process_status字段标记数据所处的工况,不要直接物理删除任何原始记录,只做逻辑过滤。
3.3 标注策略:工艺规则打底,专家复核兜底
工业数据集的标注是重头戏,也是成本最高的环节。直接把几千上万条数据扔给专家去纯手工标注,既不现实,还容易因为专家疲劳导致标注质量参差不齐。我实践中比较靠谱的方法是"规则打底、模型粗选、专家复核"三层策略。
先用工艺规则自动给数据打底。很多质量问题跟工艺参数强相关,比如某工序温度超过260度、保持时间超过5分钟,基本可以判定为异常批次。这类规则直接写进标注脚本,自动生成第一版标签。接着再用一些简单的统计方法或轻量模型做初步筛选,把明显异常的样本挑出来,让专家重点看边界样本,而不是从头到尾扫描所有数据。
专家复核环节要注意一致性控制。我会让两位专家背靠背地各标一遍抽样数据,然后计算标注一致性指标。如果两个人对同一批样本的标注结果一致率不足85%,就说明标注标准本身还有歧义,需要返回到规则定义环节继续细化。标注标准文档要写成可执行的操作定义,比如"视觉缺陷等级判定必须包含缺陷面积、颜色偏差、纹理差异三个子维度,任何一个维度超限就判定为异常",而不是空泛地写"由质检员经验判断"。
4. 数据质量度量与验证,别等建模时才发现问题
4.1 从完整性、一致性、准确性、时效性四个维度做体检
数据标准化做到一半,就要开始建立质量度量机制。核数聚里面我把它叫做"数据体检",每个版本的数据集上线前都要过一遍体检,四个维度缺一不可。
完整性关心的是数据有没有缺漏。我主要看这几个指标:表记录数是否符合预期、每个关键字段的空值率是多少、时间序列的覆盖率是否达标。比如一条产线应该每天产生86400条秒级数据,实际只有80000条,那就要去查是设备停机、采集故障还是数据丢失。
一致性关心的是同一个对象在不同地方存的是不是同一个样子。同样的设备编码在A表里叫A01-L02,在B表里叫A01_L02,到了C表里中文名直接叫"一号厂区二号产线",这就不一致。我会跑一套字段一致性规则,把每个关键字段的唯一值分布拉出来,用肉眼或者脚本检查是否存在同义不同值的情况。
准确性关心的是数据值本身对不对。最直观的做法是拿数据跟现场仪表、人工记录或第三方校准源比对。比如压力传感器采集到的值,跟质检报告里手工记录的压力值放在一起对比,偏差超过某个阈值就要标记为可疑。
时效性关心的是数据从产生到可用花了多长时间。对很多实时监控场景来说,数据晚到10分钟基本就失去价值了。在数据集层面,我考察的是接入延迟分布,如果一批数据延迟严重,不仅影响下游实时应用,也说明采集链路本身可能有故障。
下表是我在核数聚里常用的一份质量度量模板,大家可以直接改改维度用:
| 维度 | 核心指标 | 核数聚的及格标准 |
|---|---|---|
| 完整性 | 记录数完整率、关键字段空值率、时间覆盖率 | 空值率低于5%,时间覆盖率高于95% |
| 一致性 | 唯一值分布冲突数、命名规范符合率 | 命名规范符合率100%,无同义不同值 |
| 准确性 | 抽样人工比对一致率、量程超限率 | 比对照一致率高于99%,超限率低于1% |
| 时效性 | 接入延迟P95,延迟超过阈值的记录占比 | P95延迟低于采集周期的1.5倍 |
4.2 质量报告要写到什么程度才算合格
质量报告不是写给自己看的,也不是写给领导汇报用的,而是要作为数据集的组成部分一起交付的。一份合格的工业数据集质量报告,至少要写清楚这几块内容:数据集的基本信息(版本号、覆盖时间范围、设备范围、记录总数)、各字段的详细质量指标、发现的关键异常记录清单、处理动作及处理理由、字典表和映射规则的版本信息。
我把质量报告当成"数据产品的说明书"来写。建模工程师拿到数据集,第一件事应该是看质量报告,而不是直接跑模型。报告里要明确标出哪些字段因为质量问题被剔除,哪些区间被标记为缺失,哪些数据经过插值处理。这样才能避免建模人员拿着脏数据跑出好看的结果,最后上线翻车。
除了出报告,我还会做一步"破坏性验证"。就是说,故意从标准数据集里抽出一部分数据,跟原始日志做对账,检查标准化过程有没有产生数据歪曲。比如从harmonized层取出某个测点的24小时时间序列,跟原始文件里的数值逐点比对,不允许存在任何被无意识改动的值。这一步虽然笨重,但它是防止标准化过程本身引入错误的重要手段。
4.3 一个因为单位没统一导致模型翻车的案例
这里分享一个真实教训。核数聚做一条产线的能耗预测时,模型在训练集上表现很好,验证集上也非常漂亮,结果一到试运行就一塌糊涂。当时排查了很久,最后发现数据源头里有一个测点的数据单位被现场维护人员偷偷换成了非标准单位。一卷信息记录成毫米,另一卷信息记录成微米,模型看到同一个字段下两个量纲相差千倍的数值,自然被彻底带偏。
最开始发现问题,是因为我习惯性地把特征的极值和分位数拉出来看。某个长度特征的最大值突然比前一个版本大了将近1000倍,顺着这条线索去查原始记录,才发现在某个时间窗口之后,数据来源系统换了传感器,新传感器的输出单位跟旧的不一样,而点位表里没有及时更新。标准化的harmonized层当时也没有做单位校验的强制规则,这个字段的量纲混乱就这样一路流到了模型里。
这个案例之后,我再三强调:所有涉及物理量的字段,在harmonized层强制转换为国际单位制,并在字段命名里显式标注单位后缀,例如length_mm、pressure_pa、temp_c。同时校验收敛规则,加载数据时量纲有变化必须报错,而不是静默转换。这一条现在成了我所有工业数据项目的底线规则。
5. 全流程复盘:踩坑记录与能直接抄作业的经验
5.1 最大的坑:把标准化当成一次性任务
核数聚进行到第二个月时,我以为标准化的活儿已经干完了:字典建好了,映射脚本写好了,质量报告也发布了。结果第三个月一拉新数据,标准化脚本就报了一堆错——新的工单里出现了字典里不存在的故障代码,新增设备没有纳入设备编码规则,还有一位工程师新增了一个数据源,字段命名完全没按规范来。
这个坑让我彻底意识到:数据集标准化不是一次交付,而是一套持续运行的制度。数据是活的,生产系统每天都在产生新数据,任何一次版本迭代都可能引入新的字段、新的枚举值、新的设备。我现在每个标准化项目都会配套三样东西:数据字典的变更流程、新增字段的审批机制、定期的质量复检任务。新增数据源接入时,必须走一次"接入评审",对照字典逐项核对,评审不通过不允许进入标准化层。
5.2 没有专业数据平台也能跑起来
有朋友问我,公司没有买任何数据治理平台,是不是就做不了标准化。我的答案是:完全不是。核数聚开始时平台类的产品也还在选型,我们就是靠一套Python脚本加配置文件加Excel字典跑起来的。具体分工是这样的:Excel字典管元数据,YAML配置文件管清洗和映射规则,Python脚本按日执行接入和加工,输出Parquet文件加一份HTML质量报告。整套东西不依赖任何商业软件,成本极低,却把标准化流程完整地跑通了。
工具选型的核心原则是:先让规则跑起来,再考虑平台化。平台解决的是规模化和运维便利问题,但规则体系才是标准化的灵魂。如果你所在的团队还没有任何工业数据集标准化的基础,从脚本加配置文件起步是个很好的切入点。等流程稳定了,再迁移到更完善的数据平台上,迁移时带着已经验证过的规则和字典,平台就只是一个执行载体,不会被供应商绑定。
5.3 标准化是组织协作问题,不是纯技术问题
技术人员很容易把标准化当成技术活,但实际上,工业数据集标准化里最难的部分是组织协调。核数聚项目里,我们需要工艺工程师确认工序状态的定义,需要设备工程师确认点位的物理含义,需要IT工程师开放数据接口,还需要质量部门提供质检结果。任何一个角色掉链子,标准化的口径就会对不齐。
我的应对办法是建立一个"数据字典评审会"机制,每个版本的字典映射规则都要由四方共同签字确认。听起来很重,实践中却非常高效。大家坐下来逐条过一遍每个字段的定义和取值,现场就把边界条件聊清楚,比在聊天群里讨论十轮都管用。确认后的文档留档保存,作为后续数据争议的唯一仲裁依据。
再分享一个让我受益的习惯:我会把每次标准化项目的交付成果做成一个"数据资产交付包",里面必须有数据集本体、数据字典、映射脚本、质量报告、数据血缘说明这五样东西,少一样都不允许对外发布。这个习惯让我避免了太多"数据给了但永远解释不清"的尴尬局面。
最后说两句实实在在的体会。工业数据集标准化是一个永远在路上的过程,不存在"做完"的那一天。它更像是在给不断流动的工业现场数据立规矩,让每一条数据从诞生那一刻起就有明确的身份、口径和边界。规矩立得好,后面的建模、报表、数据资产化都水到渠成;规矩立得不好,所有下游工作都像是在流沙上盖房子。如果你正准备启动一个工业数据项目,不要急着写爬数和建模的代码,先从点位盘点、字典梳理和规则定义开始,这些基础工作做到位,你后面花的每一分钟都会有回报。