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)分别计算统计量,然后通过特征选择算法(如基于重要性的筛选)保留最有效的尺度。
滚动窗口统计量计算示意图(窗口大小 w=5) t-4 t-3 t-2 t-1 t t+1 t+2 t+3 当前窗口 w=5 窗口输出特征(t 时刻) 滚动均值 μ = (xt-4 + xt-3 + xt-2 + xt-1 + xt) / 5 滚动标准差 σ = √[ Σ(xi - μ)² / 5 ]

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 降维;对于树模型,共线性影响较小。
滞后特征与自相关函数(ACF)关系 原始时间序列 t t-1 t-2 t-3 自相关函数(ACF) +2σ -2σ Lag 1 Lag 2 Lag 3 Lag 4 Lag 5 ACF 图中 Lag 1~3 超出置信区间 → 应创建 Lag_1, Lag_2, Lag_3 作为特征;Lag 4 之后不显著 → 可忽略

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%。
差分特征效果对比:原始序列 vs 一阶差分 原始序列(含趋势 + 噪声) ↑ 上升趋势 一阶差分序列(消除趋势,保留波动) 围绕零线波动 → 平稳 差分后趋势被移除,模型更容易学习到“变化模式”而非“数值”

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(剔除无关特征)