4. 数据采集与预处理
在半导体制造中,良率预测模型的性能高度依赖于输入数据的质量。本章聚焦于从FDC(设备状态监控)、WAT(晶圆允收测试)和CP(芯片探测)等数据源采集原始数据,并完成对齐、清洗、缺失值处理与异常值检测等关键预处理步骤。高质量的数据预处理是模型训练成功的基石。
4.1 传感器数据(FDC)
FDC(Fault Detection and Classification)系统实时采集设备运行过程中的传感器参数,如温度、压力、气体流量、射频功率、电极电压等。这些数据通常以高频率(秒级或毫秒级)记录,是反映设备状态和工艺稳定性的第一手资料。
| 数据类型 | 典型参数 | 采样频率 | 数据量级(单腔/天) |
|---|---|---|---|
| 温度 | 加热器温度、腔体壁温、基座温度 | 1~10 Hz | ~1 GB |
| 压力 | 腔体压力、气体分压 | 1~5 Hz | ~500 MB |
| 流量 | MFC设定值、实际流量 | 1~10 Hz | ~800 MB |
| 射频功率 | 正向功率、反射功率、阻抗 | 10~100 Hz | ~5 GB |
关键点: FDC数据是时间序列数据,必须保留时间戳信息。在采集时,建议同步记录设备ID、腔室ID、工艺配方ID和晶圆ID,以便后续对齐。
4.2 测试数据(WAT / CP)
WAT(Wafer Acceptance Test)和CP(Chip Probing)数据是良率预测模型的目标变量来源。WAT在晶圆完成所有工艺后、划片前进行,测量测试键(Test Key)的电学参数;CP则在划片后对每颗芯片进行功能测试。
- WAT数据: 包含Vt(阈值电压)、Ids(饱和电流)、Rs(薄层电阻)、Cox(栅氧电容)等参数。每个晶圆通常有数十到数百个测试键,数据以晶圆为单位汇总。
- CP数据: 包含每颗芯片的良/不良标记(Bin)、测试项失效码、电流/电压测试值等。数据量巨大,单片12英寸晶圆可包含数万颗芯片。
数据对齐挑战: WAT/CP数据通常以晶圆ID或芯片坐标为主键,而FDC数据以时间戳为主键。必须建立晶圆ID与工艺时间段的映射关系,才能将设备状态数据与测试结果关联起来。
4.3 数据对齐与清洗
数据对齐是预处理中最关键的步骤之一。由于FDC、WAT和CP数据来自不同的系统,时间粒度和主键不同,必须通过以下步骤实现精确对齐:
- 时间戳对齐: 将FDC时间序列数据按晶圆加工时间段进行切片,提取每片晶圆对应的设备状态统计量(均值、标准差、最大值、最小值等)。
- 晶圆ID匹配: 以晶圆ID为桥梁,将FDC统计特征与WAT/CP测试结果进行合并。确保每个样本(晶圆或芯片)包含完整的工艺特征和测试标签。
- 重复与无效数据删除: 检查并删除因系统重传、日志重复等原因产生的重复记录。删除传感器故障、设备维护期间产生的无效数据。
- 格式与单位统一: 确保所有数值型字段的单位一致(如温度统一为摄氏度,压力统一为Torr),分类变量编码统一。
4.4 缺失值处理
半导体数据中缺失值普遍存在,原因包括传感器故障、通信中断、测试跳过等。缺失值处理不当会严重影响模型训练效果。常用策略如下:
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 删除缺失样本 | 缺失率低(<5%) | 简单、无偏差引入 | 样本量减少,可能丢失信息 |
| 均值/中位数填充 | 数值型特征,缺失随机 | 计算简单,保持均值 | 降低方差,可能引入偏差 |
| 前向/后向填充 | 时间序列数据 | 利用时间相关性 | 不适用于非时序数据 |
| 线性插值 | 连续变化的时间序列 | 平滑、合理 | 计算量稍大 |
| 模型预测填充 | 缺失率较高,特征相关性强 | 精度高 | 计算复杂,可能过拟合 |
注意: 在填充缺失值时,务必使用训练集统计量(如均值)填充验证集和测试集,避免数据泄露。对于时间序列数据,建议先按时间排序再进行填充。
4.5 异常值检测
异常值可能源于传感器漂移、设备故障、工艺波动或人为错误。异常值会误导模型学习,导致预测偏差。常用的异常值检测方法包括:
- 统计方法:
- IQR(四分位距法): 定义 Q1 - 1.5*IQR 和 Q3 + 1.5*IQR 为正常范围,超出即为异常。
- Z-Score: 计算每个数据点与均值的标准差倍数,通常阈值设为3。
- 基于密度的方法:
- DBSCAN: 基于密度的聚类算法,将低密度区域中的点标记为异常。
- LOF(局部异常因子): 衡量数据点相对于其邻域的局部密度偏差。
- 基于领域知识的方法:
- 根据工艺规范设定参数上下限(如温度不得超过400°C)。
- 利用设备维护记录标记已知异常时间段。
4.6 预处理代码示例
以下Python代码展示了使用Pandas和Scikit-learn进行数据对齐、缺失值填充和异常值检测的典型流程:
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
# 1. 加载FDC、WAT、CP数据
fdc_data = pd.read_csv('fdc_sensor_data.csv', parse_dates=['timestamp'])
wat_data = pd.read_csv('wat_test_data.csv')
cp_data = pd.read_csv('cp_probe_data.csv')
# 2. 数据对齐:以晶圆ID为键合并
# 假设fdc_data已按晶圆加工时间段聚合为每片晶圆的统计特征
merged_data = pd.merge(fdc_data, wat_data, on='wafer_id', how='inner')
merged_data = pd.merge(merged_data, cp_data, on='wafer_id', how='inner')
# 3. 删除重复行
merged_data = merged_data.drop_duplicates()
# 4. 缺失值处理:数值列用中位数填充
numeric_cols = merged_data.select_dtypes(include=[np.number]).columns
for col in numeric_cols:
if merged_data[col].isnull().sum() > 0:
median_val = merged_data[col].median()
merged_data[col].fillna(median_val, inplace=True)
# 5. 异常值检测:使用Z-Score方法
scaler = StandardScaler()
scaled_data = scaler.fit_transform(merged_data[numeric_cols])
z_scores = np.abs(scaled_data)
outlier_mask = (z_scores > 3).any(axis=1)
print(f"检测到 {outlier_mask.sum()} 个异常样本")
# 6. 移除异常样本(或根据业务规则进行修正)
clean_data = merged_data[~outlier_mask].copy()
# 7. 保存预处理后的数据
clean_data.to_csv('preprocessed_training_data.csv', index=False)
最佳实践: 在实际项目中,建议将数据预处理流程封装为Pipeline,确保训练、验证和测试集使用完全相同的变换逻辑。同时,记录每一步的统计量(如填充中位数、缩放参数),以便在模型部署时对新数据应用相同的预处理。