4. 数据采集与预处理:良率数据与工艺参数数据的采集规范、数据清洗与标准化
良率模型的核心在于“数据驱动”。原始数据直接决定了模型校准的精度与工艺偏差修正的有效性。本章聚焦于从FAB(晶圆厂)获取的原始数据到可建模数据的完整转化链路,涵盖采集规范、清洗策略与数值变换三大环节。
核心原则: 数据预处理的目标是消除非工艺因素引入的噪声,保留真实的工艺波动特征。错误的预处理会引入系统性偏差,导致模型校准失效。
4.1 数据采集规范
良率数据与工艺参数数据在采集维度、频率与格式上存在显著差异,必须建立统一的采集规范以确保数据对齐。
| 数据类型 | 采集对象 | 关键字段 | 采集频率 | 常见格式 |
|---|---|---|---|---|
| 良率数据 | 晶圆测试(WAT/CP) | Lot ID, Wafer ID, Die坐标, Bin结果, 良率值 | 每批次/每片 | CSV, STDF |
| 工艺参数数据 | 机台传感器/APC系统 | 腔室ID, 温度, 压力, 气体流量, RF功率, 时间戳 | 每片/每步/实时 | CSV, SECS/GEM日志 |
| 量测数据 | 在线量测(OCD/CD-SEM) | 膜厚, 线宽, 套刻精度, 缺陷密度 | 每片/每批次抽样 | CSV, KLARF |
采集规范要点:
- 时间戳对齐: 所有数据必须包含统一的时间戳(精度到秒),用于后续的时序匹配。
- 唯一标识符: 使用
LotID_WaferID_StepID作为主键,确保数据关联的准确性。 - 元数据记录: 记录机台型号、传感器校准日期、数据采集软件版本,用于追溯数据质量。
4.2 数据清洗:缺失值与异常值处理
原始数据中普遍存在缺失值与异常值,直接建模会导致模型偏差或收敛失败。清洗策略需根据数据特性选择。
4.2.1 缺失值处理
缺失值产生原因包括传感器故障、通信中断、测试跳过等。处理策略分为删除与填充两类。
| 策略 | 适用场景 | 方法 | 风险 |
|---|---|---|---|
| 删除 | 缺失率 > 50% 或随机缺失 | 删除整行或整列 | 样本量减少,可能丢失信息 |
| 均值/中位数填充 | 工艺参数稳定,波动小 | 用该参数的历史均值填充 | 低估方差,影响模型灵敏度 |
| 前向/后向填充 | 时间序列数据,缺失段短 | 用前一时刻或后一时刻的值填充 | 引入时序滞后 |
| 模型预测填充 | 缺失值与其他参数强相关 | 使用KNN或回归模型预测 | 计算成本高,可能过拟合 |
# Python示例:使用前向填充处理时间序列缺失值
import pandas as pd
# 假设df包含工艺参数时间序列数据
df['Temperature'].fillna(method='ffill', inplace=True)
# 对于非时序数据,使用中位数填充
median_pressure = df['Pressure'].median()
df['Pressure'].fillna(median_pressure, inplace=True)
4.2.2 异常值检测与处理
异常值通常源于机台故障、传感器漂移或操作失误。检测方法需结合工艺知识。
- 3σ 原则: 适用于正态分布数据,超出均值±3σ的值视为异常。
- IQR(四分位距)法: 适用于非正态分布,超出 Q1-1.5*IQR 或 Q3+1.5*IQR 的值视为异常。
- 局部异常因子(LOF): 适用于高维参数空间,检测局部密度异常。
- 工艺规格限: 直接使用工艺规范(Spec Limit)作为硬边界,超出即异常。
避坑指南: 不要机械地删除所有异常值。某些异常值可能代表真实的工艺偏移(如机台老化),这些数据对偏差修正模型至关重要。建议先标记异常值,再结合工艺工程师判断是否保留。
# Python示例:使用IQR法检测异常值
Q1 = df['Etch_Rate'].quantile(0.25)
Q3 = df['Etch_Rate'].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
outliers = df[(df['Etch_Rate'] < lower_bound) | (df['Etch_Rate'] > upper_bound)]
print(f"检测到 {len(outliers)} 个异常值")
4.3 数据标准化与归一化
良率模型通常涉及多个量纲不同的工艺参数(如温度范围 200-400°C,压力范围 1-100 Torr)。标准化与归一化将不同尺度的数据映射到统一区间,避免量纲差异主导模型训练。
4.3.1 标准化(Z-score)
将数据转换为均值为0、标准差为1的分布。适用于数据近似正态分布的场景,如温度、压力等工艺参数。
公式:X_std = (X - μ) / σ
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
df[['Temperature', 'Pressure']] = scaler.fit_transform(df[['Temperature', 'Pressure']])
4.3.2 归一化(Min-Max)
将数据线性缩放到 [0, 1] 区间。适用于数据有明确边界(如良率 0-100%)或非正态分布的场景。
公式:X_norm = (X - X_min) / (X_max - X_min)
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler(feature_range=(0, 1))
df[['Yield']] = scaler.fit_transform(df[['Yield']])
| 方法 | 输出范围 | 适用场景 | 对异常值敏感度 |
|---|---|---|---|
| 标准化(Z-score) | 无固定范围(通常 -3 到 3) | 正态分布、回归模型、PCA | 中等 |
| 归一化(Min-Max) | [0, 1] 或 [-1, 1] | 神经网络、距离度量模型 | 高(受极值影响大) |
| 稳健标准化(RobustScaler) | 基于中位数和IQR | 数据包含大量异常值 | 低 |
4.4 数据预处理流程总览
下图展示了从原始数据到建模数据的完整预处理流水线,包含采集、清洗、变换与对齐四个阶段。
4.5 数据对齐与融合
完成清洗与变换后,需要将良率数据与工艺参数数据按晶圆ID和时间戳进行对齐融合,形成宽表格式的训练数据集。
- 内连接: 仅保留同时存在于良率表和工艺参数表中的晶圆数据,适用于数据完整性高的场景。
- 左连接: 以良率表为主表,保留所有良率记录,工艺参数缺失的用NaN填充,适用于良率数据完整但工艺参数有缺失的场景。
- 时序窗口匹配: 对于时间敏感的工艺步骤,使用滑动窗口将工艺参数与良率结果进行时间偏移匹配。
# Python示例:按LotID和WaferID进行数据融合
yield_df = pd.read_csv('yield_data.csv')
process_df = pd.read_csv('process_params.csv')
# 内连接融合
merged_df = pd.merge(yield_df, process_df, on=['LotID', 'WaferID'], how='inner')
print(f"融合后数据集形状: {merged_df.shape}")
实战建议: 在FAB环境中,建议将预处理逻辑封装为可复用的ETL(提取-转换-加载)管道,使用Apache Airflow或Prefect进行调度,确保每次模型训练使用的数据都是经过相同流程处理的,避免因预处理差异导致模型结果不可复现。