4. 数据预处理技术:缺失值处理、异常值检测、数据标准化、特征工程在半导体数据中的应用
各位同学,咱们今天聊聊数据预处理。说实话,在半导体制造这个行当里,数据预处理比模型训练本身更费时间。我做过不少项目,真正花在调模型上的时间,可能连三分之一都不到。剩下的时间干嘛去了?全在跟脏数据较劲。
半导体数据有个特点——它特别「金贵」。一片晶圆几百道工序,每道工序采集几十个参数,一个批次下来就是海量数据。但问题在于,这些数据经常不完整。传感器偶尔抽风、设备维护期间数据断档、人为操作失误……各种情况都会导致数据缺失。
核心观点:在半导体制造中,数据预处理不是「可选项」,而是「必选项」。跳过这步直接建模,结果基本是废的。
4.1 缺失值处理:别让「空」坑了你
先说说缺失值。我见过最离谱的情况,有人直接把缺失值所在的行全删了。结果呢?原本1000条数据,删完只剩200条。模型倒是跑通了,但精度惨不忍睹。为什么?因为缺失不是随机的,它往往跟设备状态、工艺参数有关。你把它删了,相当于把关键信息也扔了。
处理缺失值,我个人习惯分三步走:
- 先搞清楚缺失类型——是完全随机缺失、随机缺失,还是非随机缺失?
- 再评估缺失比例——低于5%的,直接删行问题不大;超过30%的,这个特征基本废了,建议删列。
- 最后选填补方法——均值/中位数填补、KNN填补、多重插补,各有适用场景。
举个例子。我在处理刻蚀工序的RF功率数据时,发现某个传感器在设备维护后连续3小时数据全空。这种非随机缺失,用均值填补会严重失真。我当时用的是时间序列插值,结合前后正常数据做平滑处理。效果还不错,模型精度提升了12%。
小技巧:对于半导体数据,我建议优先用KNN填补。因为同一批次的晶圆,参数之间往往存在强相关性。KNN能利用这种相关性,比简单均值靠谱得多。
# 一个简单的KNN填补示例
from sklearn.impute import KNNImputer
import numpy as np
# 假设我们有5个工艺参数,部分数据缺失
data = np.array([
[1.2, 2.3, np.nan, 4.1, 5.0],
[1.3, 2.4, 3.1, np.nan, 5.1],
[1.1, np.nan, 3.0, 4.0, 4.9],
[1.4, 2.5, 3.2, 4.2, np.nan]
])
imputer = KNNImputer(n_neighbors=2)
data_filled = imputer.fit_transform(data)
print(data_filled)
4.2 异常值检测:揪出「捣乱分子」
异常值在半导体数据里太常见了。设备突然抖动、传感器漂移、操作员失误……都会产生异常值。但问题来了——有些异常值是真正的「坏点」,需要剔除;有些异常值其实是工艺偏移的信号,反而值得深挖。
我常用的方法有三种:
- Z-Score法——适合正态分布的数据,超过3个标准差就算异常。简单粗暴,但容易误判。
- IQR四分位距法——对非正态分布更友好。Q1-1.5*IQR到Q3+1.5*IQR之外的都是异常。
- 孤立森林——高维数据的利器。半导体数据动辄几十个维度,孤立森林比传统方法好用得多。
我记得有一次做CMP(化学机械抛光)工艺分析,发现某个批次的平坦度数据异常高。用Z-Score一查,确实超标了。但仔细一看,原来是设备刚做完维护,参数还没稳定。这种异常值不能删,得单独标记出来,作为「维护后过渡期」的特征。
避坑指南:我曾经犯过一个错误——把所有异常值一刀切删掉。结果模型在正常数据上表现很好,一到实际生产就崩。为什么?因为生产线上本来就有各种「小异常」,模型没见过这些情况,自然就傻了。所以,异常值处理要「因材施教」,该删的删,该留的留。
4.3 数据标准化:让所有特征「站在同一起跑线」
半导体数据里,不同参数的量纲差异巨大。温度可能是几百度,压力可能是几十帕,而颗粒数可能只有个位数。如果不做标准化,模型会天然偏向数值大的特征。说白了,就是「大数欺负小数」。
我常用的标准化方法有两种:
| 方法 | 公式 | 适用场景 |
|---|---|---|
| Z-Score标准化 | (x - μ) / σ | 数据近似正态分布,无严格边界 |
| Min-Max归一化 | (x - min) / (max - min) | 数据有明确边界,如百分比、浓度 |
我个人更偏爱Z-Score。为什么?因为半导体数据经常有离群点,Min-Max会被离群点「带偏」。比如某个参数正常范围是0-100,突然来了个500的异常值,Min-Max一归一化,所有正常值都被压缩到0-0.2之间,信息损失太大了。Z-Score对离群点的鲁棒性就好很多。
# Z-Score标准化示例
from sklearn.preprocessing import StandardScaler
import numpy as np
# 模拟半导体工艺参数
data = np.array([
[25.0, 100.0, 0.5],
[25.5, 102.0, 0.6],
[24.8, 98.0, 0.4],
[26.0, 105.0, 0.7]
])
scaler = StandardScaler()
data_scaled = scaler.fit_transform(data)
print("标准化后的数据:\n", data_scaled)
print("均值:", scaler.mean_)
print("标准差:", scaler.scale_)
4.4 特征工程:从「数据」到「知识」的跨越
特征工程是数据预处理里最考验功力的环节。说白了,就是把原始数据变成模型能「理解」的语言。半导体制造里,原始数据往往是传感器读数、设备状态码、批次号这些。直接扔给模型,它根本不知道这些数字代表什么。
我总结了几种常用的特征工程方法:
- 特征构造——比如把温度和压力组合成「热力学状态指数」,把多个传感器的差值作为「设备一致性指标」。
- 特征选择——用相关性分析、互信息、L1正则化等方法,筛掉冗余特征。半导体数据维度高,很多特征其实是高度相关的。
- 特征编码——设备ID、操作员ID这些类别特征,用独热编码或目标编码处理。我建议用目标编码,因为半导体数据里类别往往很多,独热编码会导致维度爆炸。
举个例子。我在做光刻工艺的良率预测时,原始数据里有「曝光剂量」和「光刻胶厚度」两个特征。单独看,它们跟良率的相关性都不高。但当我构造了一个「剂量/厚度」的比值特征后,相关性一下子从0.2跳到了0.7。这就是特征工程的魔力——它能把隐藏的信息「挖」出来。
经验之谈:做特征工程时,一定要跟工艺工程师多聊聊。他们脑子里有很多「经验公式」,比如「温度每升高10度,反应速率翻倍」。把这些经验公式转化成特征,往往比纯数据驱动的方法更有效。我每次做项目,都会花至少一天时间跟工艺团队「泡」在一起,就为了挖这些隐性知识。
4.5 知识体系总览
下面这张图,是我对本章知识体系的总结。你可以把它当成一张「地图」,以后做数据预处理时,按图索骥就行。
嗯,这张图把整个流程串起来了。从原始数据出发,经过缺失值处理、异常值检测、数据标准化、特征工程四个环节,最终得到高质量数据。每个环节都有对应的技术手段,你可以根据实际情况灵活选用。
最后说一句——数据预处理没有「银弹」。同样的方法,换一批数据可能就不好使了。多试、多调、多跟业务方沟通,这才是正道。
公众号:蓝海资料掘金营,微信deep3321