---
title: PlasmaScope 续：为什么 TabPFN 也输给了 XGBoost
author: 朱奕樟
date: 2026-05-17
summary: TabPFN per-site MAE 0.199 µm 输给 XGBoost 0.188 µm（+0.6%，Wilcoxon p=0.910）。但输得有意思：PCA 杀了 foundation model 的语义先验，TabPFN 在 SiO₂ 漂移折上不会回归到均值，NLL 17.68 是我们 σ 用错。数据集天花板 ~0.185 µm 是结构性的。
canonical: https://blog.sysu-sam.com/@zhuyizhang/plasmascope-bosch-tabpfn-diagnostic
---

## 背景重述

[上一篇](/@zhuyizhang/plasmascope-bosch-results) 写完之后，有读者来私信："你们的 V3 hybrid 最终 MAE 0.199 µm，输给 B5 XGBoost 的 0.188 µm。是不是该试试 deep 一点的方法？比如 TabPFN——一个 tabular foundation model，在百万个合成任务上预训练过，号称 zero-shot 就能击败 XGBoost on <10k 样本的小数据。"

我们觉得这个建议很合理。BOSCH Plasma-Etching 数据集刚好就是典型的"小样本、宽特征"：每折训练集 67 wafer、187 维特征，89 个 site 各自独立建一个回归。理论上正是 TabPFN 的甜区。

于是我们跑了 B7 TabPFN。结果：**MAE 0.199 µm vs B5 XGBoost 0.188 µm，相对劣化 +0.6%**，9-fold 折级 Wilcoxon p=0.910——从 MAE 看几乎完全打平。但 NLL 一个 **17.68**，另一个 **0.26**，校准差了 70 倍。

我们没有就这么写一句"TabPFN 也输了"了事。我们花了一整天做了五组诊断 (D1–D5)，把"输"这件事拆开看。结论比 MAE 数字本身有意思得多——TabPFN 没有输在"能力"上，它输在 **我们给它的预处理 pipeline 上**，以及 **它原生的 inductive bias 不适合 LOLO 这种外推评测**。这一篇把这五组诊断写成一个故事。

## 第一个 puzzle：是真输还是噪声？

第一反应是质疑"是不是 9 折太少，p=0.910 本来就没法做出判断"。我们换两种 Wilcoxon 看：

- **折级配对**（9 对）：W=21, p=**0.910**——完全像噪声
- **逐观测配对**（7476 对，每个 wafer × site）：p=**0.039**——XGBoost 的 0.009 µm 聚合优势在 α=0.05 下可检出

两个 p 值都对，描述的是不同的统计量。看一眼 per-fold breakdown 就清楚了：

| Fold | DOE | B5 MAE | B7 MAE | Winner |
|------|-----|--------|--------|--------|
| 1 | 3C-C | 0.171 | **0.144** | TabPFN |
| 2 | 1C-C | 0.206 | **0.162** | TabPFN |
| 3 | 9C-C | 0.153 | **0.133** | TabPFN |
| 4 | 3C-Si | **0.169** | 0.188 | XGBoost |
| 5 | 1C-Si | **0.198** | 0.249 | XGBoost |
| 6 | 9C-Si | 0.220 | **0.212** | TabPFN |
| 7 | 3C-SiO₂ | **0.186** | 0.262 | XGBoost |
| 8 | 3C-SiO₂ | **0.184** | 0.333 | XGBoost |
| 9 | 3C-C | 0.210 | **0.108** | TabPFN |

TabPFN 在 5 折上赢（包括 fold 9 赢了一整个 0.10 µm），在 2 折上灾难（fold 7、8，MAE 0.262 和 0.333）。**这 2 折刚好是 SiO₂ conditioning 的 lot**——也是训练集里完全没有过的 surface chemistry。把这 2 折抽掉，TabPFN 在剩下 7 折上反而平均 *赢* B5。

也就是说：聚合 MAE 的"0.6% 差距"几乎全部来自 SiO₂ lot 的外推灾难。问题不是"TabPFN 比 XGBoost 差", 而是 **"TabPFN 在 OOD 折上爆炸性失败"**。这是个完全不同的故事，需要继续拆。

![Per-fold MAE 对比](https://blog.sysu-sam.com/images/zhuyizhang/fig_per_fold_mae.png)

## 诊断 1：PCA 杀了 foundation model 的语义先验

原始 B7 的 pipeline 是：187 维特征 → PCA-20 → 喂给 TabPFN。当初做 PCA 是为了 CPU 速度——TabPFN 的 attention 在 187 维输入上慢得离谱。

我们怀疑这个 PCA 是元凶。Fold 1 上把 PCA 维度作为单变量扫一遍：

| Config | N comp | Expl. var | MAE (µm) | RMSE (µm) | Wall (s) |
|--------|--------|-----------|----------|-----------|----------|
| PCA-20 | 20 | 0.910 | 0.1644 | 0.2257 | 366 |
| PCA-50 | 50 | 0.996 | 0.1589 | 0.2183 | 415 |
| PCA-100 (→66 full-rank) | 66 | 1.000 | 0.1695 | 0.2359 | 454 |
| **No-PCA (raw 187)** | **187** | — | **0.1477** | **0.2158** | **948** |

参考线：B5 XGBoost 在 fold 1 上 MAE=0.1706 µm。

读这张表的方式是看那条 PCA-20 → 50 → 100 → No-PCA 的曲线 **不是单调的**：加维度从 20 到 50 帮了忙（更多 variance），但从 50 到 100 反而劣化，而完全去掉 PCA 又重新拿到最佳。这种 non-monotone pattern 指向一个结论——**问题不在维度，而在 PCA 旋转本身**。

直觉上：TabPFN 的预训练 prior 是建立在"特征有语义"的假设上。它在百万个合成 tabular 任务上学到的注意力 pattern，本质上是"看到这一列长得像 power，那一列长得像 pressure，按它们的物理含义和经验分布去推断"。把 187 个物理量（gas flows、power、pressure、actinometric ratios）正交旋转成 20 个抽象 PCA eigenvectors 之后，TabPFN 看到的是无意义的线性组合——预训练的 priors 全失效，只剩 in-context regression 这一层在工作。

简单 standardize（mean=0, std=1，不旋转）就够了，**foundation model 时代要警惕：别再把 PCA 当默认 preprocessing**。这条经验在 LLM 上也成立——给 GPT 喂 BPE 之外的另一层抽象编码通常都是反模式。

代价：No-PCA 比 PCA-20 慢 2.6×（948 s vs 366 s/fold）。9 折跑完估计需要 ~135 min，但 fold-1 单折就比 B5 XGBoost 低了 0.023 µm。

## 诊断 2：TabPFN 在分布漂移上不会"回归到均值"

PCA 解释了 fold 1 那种"in-distribution" 折上 TabPFN 为什么没赢到本该赢的程度。但解释不了 fold 7、8 的灾难——那两折上 TabPFN 输得比"什么都不学，直接预测 per-site 训练均值"还多：

| Fold | Per-site mean baseline MAE | B5 XGBoost MAE | B7 TabPFN MAE |
|------|---------------------------|----------------|---------------|
| 7 | 0.192 | 0.186 | **0.262** |
| 8 | 0.196 | 0.184 | **0.333** |

请注意：SiO₂ lot 的 per-site mean baseline 本身就已经很低（0.19 µm），因为它们的 wafer-to-wafer 一致性高。在这种 lot 上，任何稍微"激进推断"的模型都会比"啥都不学"更差。

XGBoost 在这件事上有个内建的保险：depth-4 的树 + L2 正则 + bagging，三重机制天然把 OOD 预测 **shrink 到训练范围内**。SiO₂ lot 没见过？模型相当于退化到 per-site mean，安全。TabPFN 不一样——它是 in-context learning，做的是后验推断：宁可"大胆推断"也不主动收缩。Fold 8 上 TabPFN 一脚踩出 0.333 µm，比 baseline 还高 70%。

但是——Spearman(B5_pred, B7_pred) per site = **0.802 ± 0.050**。两个模型在 *排序* 上几乎完全一致，它们看到了同样的信号。差别只在 **绝对幅度**：TabPFN 的预测把保险留给了用户，需要外面套一层 OOD detector + fallback to per-site mean，才能在 LOLO 这种 systematic shift 评测下稳住。

这是 inductive bias 的真面目。Tree ensemble 的 regularization 是"硬"约束（splits 有边界、leaf 值有正则），foundation model 的 prior 是"软"约束（先验对抗似然），后者在 OOD 上更容易被数据牵着走。

## 诊断 3：NLL 17.68 是 σ proxy 的锅，不是 TabPFN

整篇里最容易被误读的数字是 NLL=17.68。乍看像 TabPFN 完全不会做不确定性，其实问题在我们给它的 σ。

我们给 TabPFN 的 σ 是 "训练集残差的 std"——直接套了 B0–B5 baseline 的 sigma 估计模板。但 TabPFN 把 67 个训练 wafer 几乎背下来了，in-sample 残差近似 0。聚合下来：

- B7 σ_pred 均值 = **0.089 µm**（87/89 个 site 的 σ < 0.10）
- 实际 per-site AE 均值 = **0.198 µm**
- σ/AE 比 = **0.40**——σ 只覆盖实际误差的 40%
- 86/89 个 site 满足 σ < AE/2

Gaussian NLL 是 0.5·log(2π σ²) + 0.5·(e/σ)²，σ 估小一倍 NLL 就爆。Fold 8 的 σ=0.079, MAE=0.333，单点 NLL ≈ 67——和实测的 67.3 完美对上。

那么换 TabPFN 自带的不确定性 API 呢？我们调了 `TabPFNRegressor.predict(X_te, quantiles=[0.05, 0.95])`，期待拿到一个 honest 的预测分位数。结果：

```
Site  0: q05 = q95  →  sigma = 0
Site 10: q05 = q95  →  sigma = 0
Site 50: q05 = q95  →  sigma = 0
（所有 9 个测试 wafer × 89 个 site，全部 σ ≡ 0）
```

TabPFN 把 LOLO test lot 检测为 OOD 之后，**把预测分布坍缩成 point mass**——最大置信度，零不确定性。这是它对"我没见过这种东西"的诚实表态：与其编一个不靠谱的 σ，不如让你知道我的 quantile API 不工作。从模型角度这是合理的；从用户角度这意味着 **TabPFN 的原生 calibration 在 LOLO 外推场景下完全不可用**。

正确的修法不在模型里。是 split-conformal prediction：从训练 lot 里抽 ~10 wafer 当 calibration set，记录残差经验分布，把对应分位数作为预测区间。PICP=0.9 by construction，无需相信任何模型的内部 σ 估计。B5 XGBoost 用的 3-fold OOF residual 本质上是 conformal 的一个朴素版本——这正是它 NLL=0.26 的原因。

**踩坑结论：用 foundation model 时别迷信它的 native uncertainty。** TabPFN/Transformer/KNN 这类"记忆型"模型，σ 必须用 OOF 或 conformal，in-sample 残差 std 一律不可信。

![Reliability diagram：V3 与 stack 的实际覆盖率比 XGBoost 更贴近名义置信水平。TabPFN 用 in-sample σ 则完全偏离对角线。](https://blog.sysu-sam.com/images/zhuyizhang/fig_reliability_diagram.png)

## 诊断 4：数据本身的天花板就在 ~0.185 µm

把 D2 的数字摆出来：

| Method | MAE (µm) | Gain over per-site mean | Gain (%) |
|--------|----------|------------------------|----------|
| Per-site mean baseline（零 wafer 信号） | 0.358 | — | — |
| B5 XGBoost | 0.188 | 0.170 | 47.4% |
| B7 TabPFN | 0.198 | 0.160 | 44.8% |

B7 拿到了 B5 **94.5%** 的"可提取"信号。两个模型都在抢同一块小蛋糕。

为什么蛋糕这么小？因为这个数据集里 **98.9% 方差是稳定空间花纹**（89 个 site 的边缘效应，每片 wafer 都有），**1.1% 才是跨 wafer 的均值漂移**——后者才是 chamber-state 信号，也是任何 wafer-aware 模型唯一能比 per-site mean baseline 多学到的东西。

![Per-site MAE 分解：73/89 site 上 TabPFN 略差于 XGBoost，但中位 gap 仅 +0.019 µm](https://blog.sysu-sam.com/images/zhuyizhang/per_site_decomposition.png)

这有几个推论。第一：B5 在 89 个 site 上独立跑 89 个浅 XGBoost regressor，几乎是 Bayes 最优 setup——每个 site 把 67 个训练 wafer 的均值背下来（解决了 98.9% 方差），再用 187 维特征学剩下 1.1% 的 wafer-conditional 漂移。第二：任何方法（包括 TabPFN、PlasmaScope V3、stacking）想超过 B5，可挤的水分只在那 1.1% 里。第三：**在不引入更挑剔的评测（比如我们上一篇提的 site-permute）、或者不喂入新模态（cycle-resolved OES）的情况下，任何方法都很难低于 ~0.185 µm**——这是数据本身的天花板，不是模型缺陷。

## 该不该再跑一次 TabPFN？

诚实给个估计。如果用 raw 187 + split-conformal σ 重跑：

- **MAE 预计 0.182–0.192 µm**——乐观情况下追平甚至略超 B5（保守假设 No-PCA 优势在 SiO₂ 折上失效）
- **PICP90 预计 ~0.90**（conformal by construction）
- **NLL 预计 0.3–0.5**（与 B5 同档）
- **成本**：~135 min wall clock

故事价值在于：如果跑出来，就证明"修两个结构 bug（PCA + sigma proxy），一个 foundation model 就能与精心 tune 的 XGBoost 在所有指标上平手"。这本身就是个值得讲的方法论 contribution——它把 TabPFN 在 spatial VM 上的"输"，重新归因到 pipeline 而不是模型本身。

我们暂时不跑。一来这一批实验的算力预算用完了；二来数据天花板就在那，再跑也只是从"95% of可提取信号"挪到"98% 可提取信号"，对结论"B5 是最优"没有 qualitative 影响。之后会补一篇专门做这件事。

## 方法论 take-away

写完整组诊断，留四条经验：

1. **Foundation model + PCA 是反模式**。Foundation 模型的 prior 来自特征语义，PCA 把语义擦了。Standard scaling 够用，旋转就别加了。
2. **In-context learning 在 OOD 上比 tree ensemble 激进**。Tree ensemble 有 depth/regularization/bagging 三重内建保险，自然 shrink 到 per-site mean；in-context foundation model 把保险留给了用户。要么手动 conformal calibration，要么外面套 OOD detector + fallback。
3. **In-sample σ 用在记忆型模型上必崩**。TabPFN、Transformer、KNN 这类近乎"背诵训练集"的模型，σ 必须用 OOF 或 split-conformal，in-sample residual std 一律不可信。
4. **数据天花板 ≠ 模型缺陷**。当 98.9% 方差是固定空间花纹、可学的只剩 1.1%，争 MAE 的 0.5% 不如争 calibration、interpretability、drift transfer 这些 *正交* 维度——后者才是不同模型类别能拉开差距的地方。

更广义地说：这一篇是"为什么我们一开始就该把 SOTA 模型当作待审计的黑盒而不是当作权威"。TabPFN 的 zero-shot 主张在它的预训练分布里是真的，但 spatial VM 里 LOLO + locked recipe 这种 systematic shift 的评测，已经偏离它的预训练分布很远了。换了一个数据集，一个号称击败 XGBoost 的模型可以输给 XGBoost；修两个工程 bug，又可能追回来。把这个过程透明写出来，比直接报一个赢家更有用。

---

完整诊断的原始材料在 `analysis/tabpfn_vs_xgboost/`（含 D1–D5 的 5 份 markdown + 2 张图 + 原始 CSV）。相关讨论也欢迎回到 [前一篇 PlasmaScope 结果篇](/@zhuyizhang/plasmascope-bosch-results) 或 [dataset 介绍篇](/@zhuyizhang/plasmascope-bosch-dataset-intro) 留言。
