4. 特征工程(上)
在半导体制造中,SPC(统计过程控制)数据本质上是高维时间序列。原始数据仅包含测量值和时间戳,无法直接用于监督学习。特征工程的目标是将原始时序数据转换为能够反映良率变化趋势、周期性和异常波动的特征矩阵。本章聚焦于三类最核心的时序特征:滚动窗口统计量、滞后特征和差分特征。
核心原则:特征工程不是盲目堆砌统计量,而是基于半导体工艺的物理机理(如蚀刻速率漂移、CMP 垫老化)设计能够捕捉“过程偏移”和“短期扰动”的特征。
4.1 滚动窗口统计量
滚动窗口统计量通过在时间轴上滑动固定长度的窗口,计算窗口内数据的局部统计特征。这类特征能够平滑短期噪声,同时捕捉局部趋势和离散度变化。
4.1.1 常用统计量及物理含义
| 统计量 | 计算公式(窗口大小 w) | 工艺物理含义 |
|---|---|---|
| 滚动均值 | μt = (1/w) Σi=t-w+1t xi | 反映工艺参数的长期漂移趋势,如 CVD 膜厚随反应腔清洁周期逐渐增加 |
| 滚动标准差 | σt = √[(1/w) Σ (xi - μt)²] | 表征工艺短期稳定性,CMP 抛光速率波动增大往往预示垫层寿命末期 |
| 滚动最大值 | maxt = max(xt-w+1, ..., xt) | 捕捉瞬时峰值,如快速热退火中的温度过冲 |
| 滚动最小值 | mint = min(xt-w+1, ..., xt) | 捕捉瞬时谷值,如刻蚀速率骤降可能指示气体流量异常 |
| 滚动极差 | Rt = maxt - mint | 窗口内波动幅度,光刻对准精度中极差过大直接导致套刻误差 |
4.1.2 窗口大小的选择策略
窗口大小 w 是滚动特征最重要的超参数。在半导体场景中,w 通常与工艺腔室的维护周期或批次大小对齐。
- 短窗口(w=3~5): 捕捉晶圆到晶圆(Wafer-to-Wafer)的短期波动,适用于快速响应参数如刻蚀速率。
- 中窗口(w=10~25): 对应一个批次(Lot)或一个班次的产量,用于监控批次内一致性。
- 长窗口(w=50~100): 匹配预防性维护(PM)周期,跟踪腔室老化趋势。
实战建议:不要只使用单一窗口。采用多尺度窗口(如 w=5, 20, 50)分别计算统计量,然后通过特征选择算法(如基于重要性的筛选)保留最有效的尺度。
4.2 滞后特征
滞后特征(Lag Features)将过去时刻的观测值直接作为当前时刻的特征。这类特征能够显式地建模时间依赖性,特别适用于良率与历史工艺参数之间存在延迟相关性的场景。
4.2.1 滞后阶数的确定
滞后阶数 k 表示向前回溯多少个时间步。在半导体制造中,滞后阶数通常通过自相关函数(ACF)和偏自相关函数(PACF)分析确定。
| 滞后阶数 k | 特征名称 | 典型应用场景 |
|---|---|---|
| k=1 | Lag_1 | 上一片晶圆的测量值,用于检测连续晶圆之间的相关性 |
| k=3~5 | Lag_3 ~ Lag_5 | 对应一个晶圆盒(FOUP)的容量,用于批次内传递效应 |
| k=25 | Lag_25 | 对应一个标准批次,用于批次间工艺偏移 |
| k=50~100 | Lag_50 ~ Lag_100 | 对应 PM 周期,用于腔室老化效应 |
4.2.2 滞后特征与滚动特征的对比
| 维度 | 滞后特征 | 滚动窗口特征 |
|---|---|---|
| 信息类型 | 保留原始观测值的精确值 | 聚合统计量,丢失原始分布细节 |
| 噪声敏感性 | 高,单点异常会直接传递 | 低,通过平均或中位数平滑噪声 |
| 特征数量 | 每个滞后阶数产生一个特征 | 每个统计量产生一个特征 |
| 适用模型 | 树模型、线性模型(需处理共线性) | 所有模型,尤其是对噪声敏感的模型 |
注意多重共线性:当引入多个连续滞后特征(如 Lag_1, Lag_2, ..., Lag_10)时,相邻滞后特征之间可能存在高度相关性。对于线性模型,建议使用正则化(Lasso/Ridge)或进行 PCA 降维;对于树模型,共线性影响较小。
4.3 差分特征
差分特征通过计算当前值与历史值之间的差异,消除趋势和季节性成分,使时间序列变得平稳。在良率预测中,差分特征能够突出“变化率”而非“值”,这对于检测工艺偏移的起始点至关重要。
4.3.1 一阶差分与高阶差分
- 一阶差分: Δxt = xt - xt-1。表示相邻时间步的变化量,用于检测突发偏移。
- 二阶差分: Δ²xt = Δxt - Δxt-1。表示变化率的变化,用于检测加速度(如温度上升速率的变化)。
- 季节性差分: Δsxt = xt - xt-s。s 为周期长度(如 s=25 对应批次周期),用于消除周期性模式。
4.3.2 差分特征与滚动特征的组合
差分特征与滚动窗口特征结合使用,可以构建更强大的特征集。例如:
| 组合特征 | 计算公式 | 检测目标 |
|---|---|---|
| 滚动均值差分 | Δμt = μt - μt-1 | 局部趋势的变化方向(漂移加速或减速) |
| 滚动标准差差分 | Δσt = σt - σt-1 | 工艺稳定性的突变(如腔室污染导致波动骤增) |
| 当前值 vs 滚动均值差分 | xt - μt | 当前点偏离局部均值的程度(异常点检测) |
实战案例:在某 CMP 工艺中,滚动均值 μt 缓慢上升(垫层老化),但一阶差分 Δμt 在 PM 前后出现明显的“负跳变”。将 Δμt 作为特征后,模型对 PM 后良率恢复的预测准确率提升了 12%。
4.4 特征工程实战流程
在 Python 中实现上述特征提取,推荐使用 pandas 和 featuretools 库。以下是一个完整的特征工程代码示例:
import pandas as pd
import numpy as np
# 假设 df 包含列:'timestamp', 'wafer_id', 'param1', 'param2', 'yield'
df = pd.read_csv('spc_data.csv')
df = df.sort_values('timestamp')
# 1. 滚动窗口统计量(窗口大小 w=10)
df['param1_roll_mean_10'] = df['param1'].rolling(window=10).mean()
df['param1_roll_std_10'] = df['param1'].rolling(window=10).std()
df['param1_roll_max_10'] = df['param1'].rolling(window=10).max()
df['param1_roll_min_10'] = df['param1'].rolling(window=10).min()
# 2. 滞后特征(Lag 1, 3, 5)
df['param1_lag_1'] = df['param1'].shift(1)
df['param1_lag_3'] = df['param1'].shift(3)
df['param1_lag_5'] = df['param1'].shift(5)
# 3. 差分特征
df['param1_diff_1'] = df['param1'].diff(1) # 一阶差分
df['param1_diff_2'] = df['param1'].diff(2) # 二阶差分
df['param1_pct_change'] = df['param1'].pct_change() # 百分比变化
# 4. 组合特征:当前值 vs 滚动均值
df['param1_dev_from_mean'] = df['param1'] - df['param1_roll_mean_10']
# 5. 删除前 w 行(滚动窗口导致的 NaN)
df = df.dropna().reset_index(drop=True)
print(f"特征工程完成,最终特征维度: {df.shape[1]}")
print("新增特征列:", [col for col in df.columns if col not in ['timestamp', 'wafer_id', 'yield']])
性能优化:当数据量超过 100 万行时,建议使用
numba 加速滚动计算,或使用 polars 替代 pandas 以获得 5~10 倍的速度提升。
4.5 特征质量验证
特征构建完成后,必须进行质量验证,避免引入无效或冗余特征。
| 验证项目 | 方法 | 通过标准 |
|---|---|---|
| 缺失率检查 | 计算每个特征的 NaN 比例 | 缺失率 < 5%(滚动窗口边界除外) |
| 方差过滤 | 计算方差或标准差 | 方差 > 0(剔除常数特征) |
| 相关性分析 | 计算特征间 Pearson 相关系数 | |r| < 0.95(避免共线性) |
| 与目标变量的相关性 | 计算特征与良率的 Spearman 相关系数 | |r| > 0.05(剔除无关特征) |