3. 数据基础与预处理:设备状态数据、批次(Lot)数据、工艺路径(Route)数据、历史数据的清洗与特征工程

说实话,排产算法再牛,也怕数据拉胯。

我在MES系统里摸爬滚打这些年,见过太多算法模型跑得飞起,结果一上线就崩——不是算不出来,而是喂进去的数据全是脏的。设备状态跳变、批次时间戳对不上、Route路径里藏着幽灵站点……这些坑,我一个都没少踩。

所以这一章,咱们就聊聊数据基础。说白了,就是怎么把MES里那些乱七八糟的原始数据,洗成算法能吃的干净饭。

3.1 设备状态数据:别被“空闲”骗了

设备状态数据,是排产的眼睛。眼睛花了,路就走歪了。

MES里常见的设备状态有:运行(Run)、空闲(Idle)、待机(Standby)、维修(Down)、保养(PM)。但实际项目中,你会发现状态记录经常有“毛刺”。

核心问题:设备状态跳变太快,或者状态缺失。

比如设备从“运行”直接跳到“维修”,中间缺了“故障报警”状态。这种数据喂给算法,它会以为设备一直在干活,实际上早就趴窝了。

我习惯的做法是:

  • 状态平滑处理:短于5秒的状态跳变,直接合并到前一个状态。比如“运行→空闲→运行”中间只隔了2秒,那这2秒的空闲就是噪声,直接抹掉。
  • 状态补全:如果某台设备连续30分钟没有状态上报,我会用前后状态做插值。但注意,插值只适用于“待机”或“空闲”这类非关键状态,维修和运行状态绝对不能插。
  • 时间戳对齐:不同设备上报状态的时间粒度可能不同。有的设备每10秒上报一次,有的每30秒。我建议统一重采样到1分钟粒度,取该分钟内占比最高的状态作为该分钟的状态。

小技巧:我曾经遇到一个工厂,设备状态数据里“空闲”占比高达70%。后来一查,是因为操作员下班前忘了点“结束批次”,设备一直挂着空闲状态。这种数据,必须结合批次时间戳做交叉验证才能发现。

3.2 批次(Lot)数据:时间戳里的猫腻

批次数据是排产的“物料流”。每个Lot从进站到出站,都有时间戳记录。但这里有个大坑——时间戳的精度和一致性

举个例子:

Lot ID: A12345
进站时间: 2024-01-15 08:00:00
出站时间: 2024-01-15 08:30:00
站点: PHOTO-01

看起来没问题对吧?但如果你去查设备日志,会发现设备实际处理这个Lot的时间是08:02到08:28。那多出来的4分钟去哪了?

嗯,这里要注意:MES记录的进站时间,往往是操作员扫码的时间,不是设备真正开始加工的时间。这中间的偏差,就是排队时间或人工操作时间。

我处理批次数据时,会做以下几件事:

  1. 时间戳清洗:剔除进站时间晚于出站时间的脏数据。别笑,我见过不少这种“穿越”数据。
  2. 加工时间提取:用设备日志里的“加工开始”和“加工结束”时间,替代MES里的进站出站时间。如果拿不到设备日志,就用同站点同工艺的历史平均加工时间做估算。
  3. 批次合并与拆分:有些Lot在MES里被拆成多个子Lot,或者多个小Lot合并成一个大Lot。排产时,必须把这些合并/拆分关系还原,否则算法会重复计算。

注意:批次数据里经常有“返工Lot”和“测试Lot”。这些Lot的工艺路径和正常Lot不一样,排产时必须单独处理。我曾经因为没区分返工Lot,导致排产结果里正常Lot被挤到后面,产线经理差点跟我急。

3.3 工艺路径(Route)数据:别漏了“隐形站点”

Route数据定义了每个产品从投片到出货要经过哪些站点。看起来就是一张表:

产品型号 步骤序号 站点名称 标准加工时间(分钟)
PROD-A 10 PHOTO-01 30
PROD-A 20 ETCH-02 45
PROD-A 30 INSP-01 15

但实际跑起来,你会发现Route里藏着很多“隐形站点”。

比如:

  • 测量站点:有些工艺步骤后必须做测量,但Route里没写。操作员会自己加塞。
  • 等待站点:某些工艺后需要“静置”一段时间,比如光刻胶涂布后要等30秒。这个等待时间,Route里往往不写。
  • 返工路径:如果某站点检测不合格,Lot会跳转到返工路径。这个分支逻辑,Route数据里经常缺失。

我建议的做法是:

  1. 从历史数据反推Route:用大量Lot的实际经过站点序列,反向构建出真实的工艺路径。你会发现,80%的Lot走的是标准路径,但20%的Lot会走各种奇葩路径。
  2. 补充等待时间:对于“静置”这类隐性步骤,从设备日志里提取等待时间,作为Route的附加属性。
  3. 建立路径分支规则:把返工、跳站、跳步等逻辑,用规则引擎写清楚。排产算法在计算时,必须能识别这些分支。

避坑指南:我曾经遇到一个Route,步骤序号是10、20、30、40……但实际产线上,步骤25和35之间还有一个“隐形站点”叫QC-01。这个站点只在特定产品上出现,Route里没写。后来我通过分析历史Lot的站点序列,才发现这个规律。所以,永远不要100%相信Route数据,要拿历史数据做交叉验证。

3.4 历史数据清洗与特征工程:把“垃圾”变“黄金”

历史数据是排产算法学习的“教材”。但教材如果全是错别字,学生肯定学歪。

我清洗历史数据时,重点关注这几个方面:

3.4.1 异常值处理

设备加工时间突然暴涨10倍,批次等待时间超过24小时……这些异常值,必须处理。

我的原则是:

  • 3σ原则:超出均值±3个标准差的数据,标记为异常。但注意,半导体工艺中有些步骤的加工时间本身就是长尾分布,比如光刻机的调试时间。这时候用3σ会误杀太多数据。我改用IQR(四分位距)方法,只剔除超出Q3+1.5*IQR或低于Q1-1.5*IQR的数据。
  • 业务规则过滤:比如某台设备的加工时间不可能小于1分钟,如果出现0.5分钟,直接剔除。

3.4.2 缺失值处理

MES数据缺失是常态。设备状态缺失、批次时间戳缺失、站点名称缺失……

我常用的方法:

  • 前向填充:设备状态缺失时,用前一个状态填充。适合状态变化不频繁的场景。
  • 均值/中位数填充:加工时间缺失时,用同站点同工艺的历史中位数填充。为什么用中位数?因为加工时间分布往往有偏,均值会被极端值拉偏。
  • 模型预测填充:对于关键字段(比如批次优先级),我会用随机森林或XGBoost模型,根据其他字段预测缺失值。这招在数据量大的时候特别好用。

3.4.3 特征工程:从原始数据里“挖”出有用信息

原始数据是“矿石”,特征工程就是“提炼”。

我常用的特征包括:

  • 时间特征:批次进站时间的小时、星期几、是否节假日。半导体工厂里,周一早上和周五下午的产能往往不一样。
  • 设备特征:设备当前累计运行时间、距离上次保养的时间、设备历史良率。这些特征能反映设备的“健康状态”。
  • 批次特征:批次当前已等待时间、批次剩余步骤数、批次优先级。优先级高的Lot,排产时应该往前排。
  • 交互特征:比如“设备负载率 × 批次优先级”,能反映高优先级批次在繁忙设备上的等待时间。

核心观点:特征工程不是越多越好。我见过有人一口气造了200个特征,结果模型过拟合得一塌糊涂。我的经验是:先造20个核心特征,跑一遍模型,看特征重要性排序,再决定要不要加新特征。

3.5 知识体系总览

下面这张图,是我自己总结的数据预处理全流程。你一看就明白:

MES排产数据预处理知识体系 数据源层 设备状态数据 | 批次(Lot)数据 | 工艺路径(Route)数据 | 历史数据 数据清洗层 异常值处理(3σ/IQR) | 缺失值填充(前向/中位数/模型) 时间戳对齐 | 状态平滑 | 批次合并/拆分还原 特征工程层 时间特征 | 设备特征 | 批次特征 | 交互特征 Route分支规则提取 | 隐形站点识别 | 等待时间补充 输出:干净、结构化、带特征的排产输入数据 数据流方向

这张图把整个流程串起来了。从数据源到清洗,再到特征工程,最后输出给排产算法。每一步都有坑,每一步都需要经验。

最后提醒一句:数据预处理不是一次性工作。产线在变,设备在变,工艺在变,你的清洗规则和特征工程也要跟着变。我每季度都会重新审视一遍数据质量,看看有没有新的脏数据模式出现。这活儿虽然枯燥,但值。


公众号:蓝海资料掘金营,微信deep3321