Day 3:分类问题 —— 外延片 Pass / Fail 质量预测
今天开始进入真正的机器学习任务。
Day 1 讲:
业务场景 → AI 任务类型Day 2 讲:
X 是什么,y 是什么,训练集/测试集是什么,什么是数据泄露Day 3 专门讲:
分类问题 Classification也就是:
给模型一批历史样本,让它学习什么样的外延片更容易 Pass,什么样的外延片更容易 Fail。
1. 什么是分类问题?
分类问题就是:
输入一组特征 X
输出一个类别 y在外延片场景里,最典型的是:
输入:
MBE 生长参数、设备状态、recipe、衬底批次、源材料状态
输出:
Pass / Fail也可以是:
低风险 / 中风险 / 高风险或者:
PL 异常 / XRD 异常 / 厚度异常 / 表面缺陷异常2. 外延片质量预测里的分类任务
任务 1:综合 Pass / Fail 分类
这是第一版最推荐做的。
y = Pass / Fail例子:
| wafer_id | temp_std | pressure_std | alarm_count | qc_result |
|---|---|---|---|---|
| W001 | 1.2 | 0.03 | 0 | Pass |
| W002 | 3.8 | 0.12 | 2 | Fail |
| W003 | 1.5 | 0.04 | 0 | Pass |
| W004 | 4.1 | 0.15 | 3 | Fail |
模型学到的可能是:
温度波动越大
压力波动越大
报警次数越多
Fail 风险越高任务 2:单项异常分类
综合 Pass/Fail 太粗,可以拆细。
例如:
pl_fail:PL 是否异常
xrd_fail:XRD 是否异常
thickness_fail:厚度是否异常
surface_fail:表面缺陷是否异常这比单纯 qc_result 更有业务价值。
因为工程师不只想知道:
这批片有风险他还想知道:
风险主要来自 PL?
还是 XRD?
还是厚度?
还是表面缺陷?任务 3:风险等级分类
有时候不要直接做 Pass / Fail,而是做:
低风险 / 中风险 / 高风险比如:
| fail_probability | risk_level |
|---|---|
| 0.05 | 低风险 |
| 0.28 | 中风险 |
| 0.72 | 高风险 |
这个更适合生产现场。
因为第一版模型不应该直接替工程师判废,而应该做:
风险提醒系统不是:
自动判废系统3. 二分类、多分类、多标签,要分清楚
3.1 二分类 Binary Classification
只有两个类别:
Pass / Fail这是最简单的分类问题。
外延片质量预测第一版就用它。
3.2 多分类 Multi-class Classification
多个类别,但每个样本只属于其中一个。
比如 wafer map 缺陷分类:
center defect
edge defect
ring defect
scratch defect
random defect
no defect每张图只能分到一个主要类别。
3.3 多标签 Multi-label Classification
一个样本可以同时属于多个类别。
比如一片外延片可能同时存在:
PL 异常
XRD 异常
表面缺陷偏多这就是多标签。
对应标签可以长这样:
| wafer_id | pl_fail | xrd_fail | surface_fail |
|---|---|---|---|
| W001 | 0 | 0 | 0 |
| W002 | 1 | 0 | 1 |
| W003 | 0 | 1 | 0 |
外延片质量问题里,多标签其实很常见。
但第一阶段不要太复杂,先做二分类:
Pass / Fail4. 分类模型输出的不是“真相”,而是概率
这一点非常重要。
模型通常不是直接说:
Fail而是输出:
Fail 概率 = 0.72也就是:
在历史数据规律下,这批片看起来像 Fail 的概率是 72%所以模型结果应该这样用:
Fail 概率 0.00 ~ 0.20:低风险
Fail 概率 0.20 ~ 0.50:中风险,建议复核
Fail 概率 0.50 ~ 1.00:高风险,重点检查注意:
0.72 不是说它一定坏,而是说它值得工程师重点关注。
5. 分类模型怎么学?
你可以把模型理解成:
它在历史数据里找规律:
哪些特征组合更像 Pass?
哪些特征组合更像 Fail?例如:
Pass 样本常见特征:
temp_std 小
pressure_std 小
alarm_count 少
days_since_maintenance 短
Fail 样本常见特征:
temp_std 大
pressure_std 大
alarm_count 多
source_usage_hours 长模型学到这些关系后,未来来一条新数据:
temp_std = 4.2
pressure_std = 0.15
alarm_count = 3
source_usage_hours = 850模型可能输出:
Fail 概率 = 0.766. 第一版应该用什么分类模型?
外延片质量预测第一版,我建议按这个顺序学。
6.1 Logistic Regression:线性基线
它适合做第一个 baseline。
优点:
简单
快
容易解释
能看出是否有基本信号缺点:
表达能力有限
不适合复杂非线性关系半导体制造数据一般不是简单线性,所以它通常不是最终模型。
但它适合回答:
最简单模型能不能看到一点规律?6.2 Random Forest:非线性基线
随机森林比逻辑回归强一些。
优点:
能处理非线性
不太需要特征缩放
比较稳缺点:
在高维、复杂表格数据上不一定最强
解释性一般它适合做第二个基线。
6.3 LightGBM / XGBoost / CatBoost:主力模型
这是第一版真正推荐的主力。
外延片数据通常是:
表格数据
数值特征多
类别字段多
非线性关系多
样本量可能不算特别大所以第一版最合适的是:
CatBoost
LightGBM
XGBoost我的建议:
类别字段很多:CatBoost 优先
数值字段很多:LightGBM 优先
想做稳健对比:三个都跑一遍第一版不要急着上深度学习。
因为:
如果只是表格数据,深度学习未必更强;
而且更难解释、更难上线、更吃数据量。7. 分类问题最重要的不是 Accuracy
这是今天最重要的内容。
很多人一开始只看:
accuracy = 准确率但在半导体质量预测里,accuracy 很容易骗人。
举个例子
假设 1000 批外延片里:
950 批 Pass
50 批 Fail一个很蠢的模型永远预测:
全部 Pass它的 accuracy 是:
950 / 1000 = 95%看起来很高。
但它一个坏片都没抓出来。
所以这个模型在业务上是废的。
8. 混淆矩阵:分类问题必须看懂
我们把 Fail 当成正类 Positive。
因为我们真正关心的是:
能不能抓出 Fail混淆矩阵如下:
| 实际 Fail | 实际 Pass | |
|---|---|---|
| 预测 Fail | TP | FP |
| 预测 Pass | FN | TN |
解释:
TP:真实 Fail,模型也预测 Fail,抓对了坏片
FP:真实 Pass,模型预测 Fail,误报
FN:真实 Fail,模型预测 Pass,漏掉坏片
TN:真实 Pass,模型也预测 Pass,正常放行在半导体场景里,最危险的是:
FN = 漏报坏片因为坏片流出去,可能导致:
客户投诉
退货
失去信任
后续芯片加工浪费9. Precision、Recall、F1 怎么理解?
9.1 Recall:坏片抓出来多少?
Recall = TP / (TP + FN)意思是:
所有真实 Fail 里面,模型抓出来多少?比如:
真实 Fail 有 50 批
模型抓出来 40 批
Recall = 40 / 50 = 80%在质量预警里,Recall 很重要。
因为你希望尽量不要漏掉坏片。
9.2 Precision:报警里面有多少是真的?
Precision = TP / (TP + FP)意思是:
模型报警的批次里面,有多少真的 Fail?比如:
模型报警 100 批
其中真实 Fail 40 批
Precision = 40 / 100 = 40%Precision 太低,工程师会被大量误报烦死。
9.3 F1:Precision 和 Recall 的折中
F1 = 2 * Precision * Recall / (Precision + Recall)它综合考虑:
抓得多不多
报警准不准10. 半导体里应该优先看哪个指标?
我的建议:
第一优先级:Fail Recall
第二优先级:Top-K Recall
第三优先级:Precision
第四优先级:PR-AUC
第五优先级:Accuracy为什么?
因为第一版模型的目标不是自动判废,而是:
把最值得复核的高风险批次挑出来所以你更应该看:
风险最高的前 10% 批次里,覆盖了多少真实 Fail?这就是 Top-K Recall。
11. Top-K Recall 是什么?
假设有 1000 批外延片,其中 50 批真实 Fail。
模型给每批片一个 Fail 风险分。
我们按风险从高到低排序,取前 10%,也就是 100 批。
如果这 100 批里包含了 35 批真实 Fail,那么:
Top 10% Recall = 35 / 50 = 70%这很有业务意义。
它等价于对老板说:
只让工程师重点复核风险最高的 10% 批次,
就能提前覆盖 70% 的异常批次。这句话比:
模型 accuracy 是 95%专业得多,也更有商业价值。
12. 阈值为什么很重要?
模型输出概率:
Fail 概率 = 0.31
Fail 概率 = 0.52
Fail 概率 = 0.78你要决定:
超过多少算高风险?很多默认分类阈值是:
0.5但在质量预警里,不一定用 0.5。
比如:
Fail 概率 > 0.2:进入关注列表
Fail 概率 > 0.5:进入重点复核
Fail 概率 > 0.8:暂停出货,工程师强制复查所以分类模型不是简单输出 Pass/Fail,而是配合业务动作做分层。
13. 阈值和业务动作要绑定
你可以这样设计:
| Fail 概率 | 风险等级 | 业务动作 |
|---|---|---|
| 0.00 ~ 0.20 | 低风险 | 正常流程 |
| 0.20 ~ 0.50 | 中风险 | 增加一项检测或工程师抽查 |
| 0.50 ~ 0.80 | 高风险 | 优先复核 PL / XRD / 表面检测 |
| 0.80 ~ 1.00 | 极高风险 | 暂缓出货,工程师强制复查 |
这样模型就不是一个孤立算法,而是嵌入业务流程。
14. 一个完整的小例子
假设测试集有 100 批外延片:
真实 Fail:20 批
真实 Pass:80 批模型预测结果:
预测 Fail:30 批
其中真实 Fail:15 批
其中真实 Pass:15 批
预测 Pass:70 批
其中真实 Fail:5 批
其中真实 Pass:65 批那么:
TP = 15
FP = 15
FN = 5
TN = 65Recall:
15 / (15 + 5) = 75%Precision:
15 / (15 + 15) = 50%Accuracy:
(15 + 65) / 100 = 80%业务解释:
模型抓出了 75% 的异常批次。
但报警的 30 批里,只有一半是真的异常。工程上这可能是可以接受的。
因为第一版是风险提醒系统,不是自动判废系统。
15. 分类建模最小代码
今天你不需要背代码,但要看懂流程。
import pandas as pd
from sklearn.metrics import (
classification_report,
confusion_matrix,
average_precision_score,
precision_recall_curve
)
from catboost import CatBoostClassifier
# 1. 读取数据
df = pd.read_csv("epi_quality.csv")
# 2. 定义标签
target = "qc_result"
y = df[target].map({
"Pass": 0,
"Fail": 1
})
# 3. 根据预测时间点删除不能用的字段
drop_cols = [
"qc_result",
"pl_intensity",
"xrd_fwhm",
"surface_defect_count",
"engineer_final_comment",
"customer_feedback",
"shipment_decision",
]
X = df.drop(columns=drop_cols)
# 4. 删除纯 ID 字段
id_cols = ["lot_id", "wafer_id", "run_id"]
X = X.drop(columns=id_cols)
# 5. 类别特征
cat_features = [
"product_type",
"recipe_id",
"equipment_id",
"chamber_id",
"substrate_batch",
"source_material_batch",
]
# 6. 按时间切分
split_idx = int(len(df) * 0.8)
X_train = X.iloc[:split_idx]
X_test = X.iloc[split_idx:]
y_train = y.iloc[:split_idx]
y_test = y.iloc[split_idx:]
# 7. 训练分类模型
model = CatBoostClassifier(
iterations=500,
depth=6,
learning_rate=0.03,
loss_function="Logloss",
eval_metric="AUC",
verbose=100
)
model.fit(
X_train,
y_train,
cat_features=cat_features
)
# 8. 输出 Fail 概率
fail_proba = model.predict_proba(X_test)[:, 1]
# 9. 设置风险阈值
threshold = 0.3
y_pred = (fail_proba >= threshold).astype(int)
# 10. 评估
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
print("PR-AUC:", average_precision_score(y_test, fail_proba))这段代码里你重点看 4 个东西:
y = Pass/Fail 标签
drop_cols = 防止数据泄露
fail_proba = Fail 风险概率
threshold = 风险阈值16. Top-K Recall 代码
这个指标很适合工业质量预警。
import numpy as np
def top_k_recall(y_true, y_score, k_ratio=0.1):
"""
y_true: 真实标签,Fail=1,Pass=0
y_score: 模型输出的 Fail 概率
k_ratio: 取风险最高的前多少比例
"""
n = len(y_true)
k = int(n * k_ratio)
# 按风险分从高到低排序
order = np.argsort(-y_score)
# 取风险最高的前 k 个
top_k_idx = order[:k]
# 总 Fail 数
total_fail = np.sum(y_true == 1)
# Top-K 里面命中的 Fail 数
hit_fail = np.sum(y_true.iloc[top_k_idx] == 1)
return hit_fail / total_fail
recall_top_10 = top_k_recall(y_test, fail_proba, k_ratio=0.1)
print("Top 10% Recall:", recall_top_10)业务解释:
风险最高的前 10% 批次,覆盖了多少真实 Fail。这非常适合跟老板讲。
17. 分类模型最终输出不应该只是 0/1
不要让系统只输出:
Pass
Fail更好的输出是:
批次:L2026-001
Fail 概率:0.68
风险等级:高
建议动作:优先复核再加上解释:
主要风险因子:
1. temp_std 高于同 recipe 历史 95 分位
2. pressure_std 明显偏高
3. alarm_count 高于近期正常水平
4. source_usage_hours 偏长
5. days_since_maintenance 偏长这样工程师才会觉得模型有用。
18. 分类问题最常见的 5 个坑
坑 1:只看 Accuracy
制造业数据通常类别不平衡,只看 Accuracy 很危险。
坑 2:Fail 样本太少还硬做分类
如果 Fail 样本只有十几个,模型很难学到稳定规律。
这时可以先做:
异常检测
质量分预测
单项指标回归
工程师风险等级标注坑 3:预测时间点不清楚
不知道模型在什么时候预测,就不知道哪些字段能用。
这会直接导致数据泄露。
坑 4:把检测后字段放进输入
例如:
pl_intensity
xrd_fwhm
final_qc_result
shipment_decision如果预测时间点是检测前,这些都不能用。
坑 5:模型没有业务动作
模型说:
Fail 概率 0.63但没有告诉工程师该做什么。
这种模型很难落地。
必须配合:
风险等级
复核建议
优先检测项
相似历史案例19. 你今天要形成的专业表达
以后你跟客户讲分类模型,不要说:
我们可以训练一个模型判断好坏。你要说:
我们会先把质量预测定义成一个二分类风险评分问题。
模型不是直接替代工程师判废,而是输出每批外延片的 Fail 概率。
然后按照风险分层,把高风险批次推送给工程师优先复核。
评估上我们不会只看准确率,而会重点看 Fail Recall、Top-K Recall 和误报成本。这段话就是专业咨询表达。
20. Day 3 课堂练习
练习 1:判断分类类型
问题 A
预测外延片 Pass / Fail答案:
二分类问题 B
判断 wafer map 是中心缺陷、边缘缺陷、环形缺陷还是划痕缺陷答案:
多分类问题 C
判断一片外延片是否同时存在 PL 异常、XRD 异常、表面缺陷异常答案:
多标签分类练习 2:手算混淆矩阵指标
假设:
TP = 30
FP = 20
FN = 10
TN = 140那么:
Recall = TP / (TP + FN) = 30 / 40 = 75%
Precision = TP / (TP + FP) = 30 / 50 = 60%
Accuracy = (TP + TN) / 总数 = 170 / 200 = 85%业务解释:
模型抓出了 75% 的真实异常批次。
报警的批次里,有 60% 真的异常。
整体准确率 85%,但不能只看这个指标。21. Day 3 作业
今天作业有 3 个。
作业 1:定义一个分类任务
按照这个格式写:
任务名称:
分类类型:二分类 / 多分类 / 多标签
正类是什么:
输入 X:
输出 y:
预测时间点:
业务动作:示例:
任务名称:
MBE 生长后外延片 Fail 风险预测
分类类型:
二分类
正类:
Fail
输入 X:
recipe_id
equipment_id
chamber_id
substrate_batch
source_material_batch
growth_temp_mean
growth_temp_std
pressure_mean
pressure_std
alarm_count
days_since_maintenance
输出 y:
qc_result = Pass / Fail
预测时间点:
MBE 生长完成后,检测前
业务动作:
Fail 概率超过 0.3 的 run 进入工程师复核列表作业 2:设计风险阈值
你自己设计一套阈值。
格式:
Fail 概率 0.00 ~ ?
风险等级:
业务动作:
Fail 概率 ? ~ ?
风险等级:
业务动作:
Fail 概率 ? ~ ?
风险等级:
业务动作:参考:
0.00 ~ 0.20:低风险,正常流程
0.20 ~ 0.50:中风险,增加抽检
0.50 ~ 0.80:高风险,工程师优先复核
0.80 ~ 1.00:极高风险,暂缓出货作业 3:解释分类指标
用自己的话解释:
Accuracy:
Precision:
Recall:
F1:
Top-K Recall:重点解释:
为什么外延片质量预测不能只看 Accuracy?
为什么 Fail Recall 很重要?
为什么 Top-K Recall 适合老板听?22. Day 3 验收标准
你今天合格的标准是:
1. 能解释什么是分类问题
2. 能区分二分类、多分类、多标签
3. 能说清楚为什么 Fail 是正类
4. 能看懂 TP / FP / FN / TN
5. 能解释 Precision 和 Recall
6. 能说明为什么 Accuracy 不够
7. 能理解阈值不是固定 0.5
8. 能把模型输出变成业务动作23. Day 3 最核心总结
今天只记住这句话:
外延片 Pass / Fail 预测不是为了让模型替工程师判废,而是让模型给每批片打一个 Fail 风险分,再把高风险批次优先交给工程师复核。
所以分类问题的核心不是:
模型准确率多高而是:
坏片抓出来多少
误报成本能不能接受
风险最高的批次是否值得复核
模型结果能不能变成业务动作