3. 数据采集与ETL:从MES/SECS/GEM协议获取数据、数据清洗、数据转换与标准化
各位工程师朋友,大家好。这一章我们聊聊数据从哪里来,又怎么变成能用的样子。
我在FAB里摸爬滚打这些年,最深的体会就是:数据采集和ETL,占了整个数据分析工作量的60%以上。你想想看,模型再漂亮,算法再高级,数据源头是脏的、乱的,那后面全是白费功夫。
说白了,晶圆制造的数据采集,核心就是三个系统:MES、SECS、GEM。咱们一个一个说。
3.1 数据源:MES、SECS、GEM
MES(制造执行系统),这是FAB的大脑。它管着lot的流转、工单的派发、工艺参数的设定。MES里存的是结构化数据,比如批次号、设备ID、工艺步骤、测量值。我个人习惯,先从MES拉取lot的履历数据,这是最基础的。
SECS/GEM,这是设备和主机之间的通信协议。SECS是底层协议,定义怎么传数据。GEM是上层标准,定义传什么数据。设备每跑完一片wafer,会通过GEM上报一堆参数:温度、压力、RF功率、时间……这些是实时数据,频率很高。
我在项目中遇到过一个问题:某台刻蚀机,GEM上报的RF功率偶尔会跳变到0,持续几秒钟又恢复。如果不做清洗,这个异常值会直接拉低整个批次的良率预测。所以,数据采集只是第一步,清洗才是关键。
核心要点:
- MES数据:批次、工单、工艺步骤、测量值(低频、结构化)
- SECS/GEM数据:设备实时参数(高频、时序性)
- 两者需要按lot ID或wafer ID关联起来
下面这张图,是我自己画的ETL流程框架,你看一眼就明白了。
3.2 数据清洗:缺失值、异常值、重复值
数据采集上来,第一件事不是分析,是清洗。我见过太多人,数据拉下来直接跑模型,结果一塌糊涂。为什么?因为数据里有坑。
3.2.1 缺失值处理
晶圆制造中,缺失值很常见。比如某台设备在维护期间没上报数据,或者某个测量站点跳过了。处理方式有三种:
- 删除:如果缺失比例小于5%,直接删掉该行。我一般用这个。
- 填充:用均值、中位数、或者前向填充(forward fill)。对于时序数据,前向填充更合理。
- 插值:线性插值或样条插值,适合连续变化的参数,比如温度曲线。
我的经验:对于刻蚀速率这种参数,如果缺失值出现在工艺稳定期,用中位数填充没问题。但如果出现在工艺切换点,千万别填充,直接标记为缺失,让模型自己处理。
3.2.2 异常值检测
异常值,说白了就是那些明显不合理的数据点。比如RF功率突然变成0,或者温度飙到1000°C(正常只有400°C)。
常用的方法:
- 3σ原则:数据在均值±3个标准差之外,视为异常。适合正态分布的数据。
- IQR方法:四分位距法。Q1-1.5*IQR 到 Q3+1.5*IQR 之外,视为异常。更稳健,不受极端值影响。
- 业务规则:比如压力不能为负,温度不能超过设备上限。这个最直接。
注意:我曾经遇到过一个case,某台CMP设备的抛光压力数据,用3σ方法检测出大量异常值。后来发现,是因为工艺配方切换导致压力正常波动。所以,异常值检测一定要结合工艺知识,不能纯靠统计。
3.2.3 重复值处理
重复值通常是因为数据采集程序bug,或者网络重传导致的。处理很简单:按时间戳去重,保留第一条或最后一条。
我建议保留最后一条,因为那可能是重传后的正确数据。
3.3 数据转换与标准化
清洗完了,数据还不能直接用。为什么?因为不同设备、不同参数的单位和量纲不一样。比如温度是°C,压力是Torr,RF功率是W。如果不做转换,模型会偏向数值大的特征。
3.3.1 数据转换
常见的转换包括:
- 单位统一:比如所有长度单位统一为μm,所有压力单位统一为Torr。
- 格式转换:时间戳统一为Unix时间戳或ISO 8601格式。
- 类型转换:把字符串类型的设备ID转为category类型,节省内存。
3.3.2 标准化
标准化有两种主流方法:
| 方法 | 公式 | 适用场景 | 我的建议 |
|---|---|---|---|
| Z-score标准化 | (x - μ) / σ | 数据近似正态分布,有异常值 | 推荐用于回归模型 |
| Min-Max标准化 | (x - min) / (max - min) | 数据有明确边界,如温度范围 | 推荐用于神经网络 |
嗯,这里要注意:标准化一定要在训练集上计算参数(均值和标准差),然后用同样的参数去转换测试集。千万别把测试集的数据混进来算,否则会造成数据泄露。
实战代码片段(Python):
from sklearn.preprocessing import StandardScaler, MinMaxScaler
# 假设 df 是清洗后的数据,features 是特征列
scaler = StandardScaler()
df_scaled = scaler.fit_transform(df[features])
# 保存scaler参数,用于后续新数据
import joblib
joblib.dump(scaler, 'scaler_params.pkl')
我个人习惯,对于晶圆制造数据,优先用Z-score标准化。因为设备参数往往有异常值,Min-Max会被极端值拉偏。Z-score对异常值更鲁棒一些。
3.4 避坑指南
最后,分享几个我踩过的坑:
- 时间对齐问题:MES数据是分钟级的,GEM数据是秒级的。关联时一定要先按lot ID分组,再按时间戳对齐。我曾经直接用时间戳join,结果数据全乱了。
- 设备ID不一致:MES里叫"ETCH-01",GEM里叫"ETCH01"。这种小问题,清洗时一定要统一。
- 缺失值不要全删:如果某个参数缺失率超过50%,我建议直接丢弃该特征。但如果缺失率在10%-30%,可以尝试用模型预测填充。
- 标准化后检查分布:标准化完,记得画个直方图看看。如果数据还是偏态,考虑做log变换。
好了,这一章的内容就到这里。数据采集和ETL,看似基础,但做扎实了,后面的分析会顺畅很多。记住一句话:垃圾进,垃圾出。数据质量决定了分析的天花板。