MLS-Bench 任务详解与 Autoresearch 进展

每个任务在做什么 · 评测怎么打分的 · 模型(deepseek-v4-pro)在任务中实际做了什么 · 中间发生了什么
OPHIS Project dsh 极简 + deepseek-v4-pro 2026-08-17
目录 0. 阅读指南:这份文档怎么读 0.1 指标速查(每个指标到底是什么意思) 1. causal-observational-linear-gaussian(线性高斯因果发现) 2. causal-observational-linear-non-gaussian(线性非高斯 LiNGAM) 3. causal-observational-nonlinear(非线性加性噪声因果发现) 4. causal-discovery-discrete(离散贝叶斯网络因果发现) 5. causal-treatment-effect(因果处理效应估计) 6. ml-symbolic-regression(符号回归) 7. ml-anomaly-detection(异常检测) 8. ml-clustering-algorithm(聚类) 9. ml-dimensionality-reduction(降维) 10. ml-calibration(概率校准) 11. ml-selective-deferral(选择性放权) 12. ml-subgroup-calibration-shift(子群校准偏移) 13. ai4sci-mol-property-prediction(分子性质预测) 14. ml-ensemble-boosting(集成提升)— 评测环境缺陷 15. ml-missing-data-imputation(缺失值填补)— 评测环境缺陷 16. 进展图与时间线:每张图怎么读

00 阅读指南

这份文档回答三个问题:每个 MLS-Bench 任务到底在做什么(背景、输入、输出、怎么打分)、 deepseek-v4-pro 模型在任务中实际做了什么(它写的算法、它改了哪些东西)、 以及 中间到底发生了什么(模型观察了什么中间量、怎么调试、怎么迭代)。

所有运行都是 dsh 极简模式(只保留 Bash + 文件编辑器两个工具,没有网页搜索、没有计划模式、没有子代理)+ deepseek-v4-pro 模型,不限时,跑到 agent 自己觉得完成(写 RESULT.md)为止。 运行在两台机器:ophis-gpu(8×H200)和 360-1(8×H100)。

关于「中间观察」:这是这份文档的重点。我们想验证的问题是——模型在优化/构造过程中,会不会自发地观察除最终指标之外的中间量(训练损失、中间表示、数据分布、残差独立性、算法内部状态等),并用这些观察来指导下一步。 结论先放在这里:会,而且非常主动。每个任务我们都记录了模型实际写下的 probe / debug 脚本和它观察到的中间量。

00.1 指标速查

下面这些指标会反复出现。先记住它们的含义,后面的任务就都能读懂了。

指标全称含义(用大白话)方向
SHDStructural Hamming Distance你画出来的因果图,和真实因果图相比,「边」对不上(多了/少了/方向反了)的总数。0 = 完美还原。越低越好
F1F1 score「找对的边 / 所有找出来的边」和「找对的边 / 所有真实存在的边」的调和平均。1 = 完美,0 = 全错。越高越好
Precision / Recall精确率 / 召回率Precision:你声称有的边里有多少真的存在;Recall:真实存在的边里你找到了多少。越高越好
CPDAGCompleted Partially Directed Acyclic Graph因果图的一种「等价类」表示:有些边方向确定(→),有些边方向未定(—)。线性高斯数据下只能识别到这个程度。—
DAGDirected Acyclic Graph有向无环图,每条边都有明确方向。—
R²Coefficient of Determination回归拟合优度:模型解释了数据中多大比例的方差。1 = 完美拟合,0 = 不如直接用均值。越高越好
RMSERoot Mean Squared Error预测值与真实值之差的均方根。越小越好。越低越好
AUROCArea Under ROC Curve二分类器把「正类排前面」的能力。0.5 = 瞎猜,1.0 = 完美。越高越好
ECEExpected Calibration Error校准误差:模型说「我有 90% 把握」时,实际有多少次真的对了。0 = 完美校准。越低越好
ARIAdjusted Rand Index聚类结果与真实类别的匹配度(考虑随机因素修正)。1 = 完全一致,0 = 随机。越高越好
NMINormalized Mutual Information聚类与真实类别的互信息归一化。1 = 完全一致。越高越好
PEHEPrecision in Estimation of Heterogeneous Effects估计的个体处理效应与真实个体处理效应的均方根误差。0 = 完美估计每个个体的效应。越低越好
ATE errorAverage Treatment Effect error估计的平均处理效应与真实平均处理效应之差。越低越好
rocaucROC-AUC分子性质预测的评估指标(每个数据集一个),含义同 AUROC。越高越好
elapsed_*elapsed该场景单次评测消耗的秒数。这个数字本身不参与排名,但用来判断算法是否太慢(超时会判无效)。—
评测协议统一说明:所有任务都是「固定评测脚本 + 隐藏的测试数据/场景」。agent 只能改它工作区里的可编辑文件(通常是 custom_*.py),不能碰评测 harness。评测脚本会跑 agent 的实现,打印训练/测试指标,最后输出一个 === METRICS === JSON 块。每个任务都有若干官方 baseline(比如 PC、BOSE、t-SNE 等),agent 的目标是超过它们。

01 causal-observational-linear-gaussian

任务背景:因果发现是什么

因果发现(causal discovery)的目标是:只凭一堆观测数据,反推出变量之间的因果结构——也就是"谁直接导致谁"的有向图。 举例:我们观测到"喝咖啡的人心脏病发病率高"。但可能是咖啡导致心脏病(A→B),也可能是心脏病让人多喝咖啡(B→A), 还可能是有第三个因素(比如压力大)同时导致两者(A←C→B)。因果发现就是从数据里区分这三种可能。

本任务的假设是 线性高斯结构方程模型(linear Gaussian SEM):每个变量的值 = 父变量的线性组合 + 高斯噪声。 在这个假设下,因果结构有一个著名的不可识别性结论:仅凭观测分布,你最多只能识别到 CPDAG(部分有向无环图)——即哪些边存在、哪些方向确定、哪些方向未定。 但是!如果所有变量的噪声方差相等,结构就完全可识别(可以区分所有方向)。这是本任务的核心知识点。

任务内容与评测

项说明
输入5 个数据场景(各几百到几千样本):ER10、ER20(随机有向图)、SF50、SF50-Hard(稠密无标度图)、ER20-Noisy(含噪声方差不等)
agent 可改文件causal-learn/bench/custom_algorithm.py 里的 run_causal_discovery()
评测指标SHD(结构汉明距离,越低越好)、Adj Precision/Recall(边存在性)、Arrow Precision/Recall(方向正确性)
官方 baselinePC(SHD 344)、GRaSP(109)、BOSS(24)——注意这是跨 5 场景的总 SHD

baseline 数字来自官方 leaderboard:PC 344、GRaSP 109、BOSS 24(5 场景总和)。这个任务被官方评为「很能区分 agent 能力」的中等难度任务。

模型做了什么(EVS 算法)

agent 写了一个全新的算法 EVS(Equal-variance Cholesky Score search,等方差 Cholesky 分数搜索),核心思路:

  1. 顺序搜索:利用等方差结构(协方差逆矩阵 = (I−B)ᵀ(I−B)/σ²),用"叶剥离"(每次剥掉一个最像叶子的节点)恢复拓扑顺序;再用一个平滑的联合似然分数做细化。
  2. 创新点:bagged 共识顺序。在弱边上,单个样本的分数几乎平坦、容易猜反方向。agent 用 bootstrap 重采样 + 多数投票(Copeland 计分)把这种随机噪声平均掉。只有当细化顺序的优势「显著」(bootstrap 校准的 2 个标准差检验)时才采用细化结果,否则用集成顺序。
  3. 创新点:联合边集坐标下降。因为共享方差把所有节点耦合在一起,逐节点贪心会丢掉被相关父节点掩盖的弱边;所以改为对整组边做 add/remove/swap 的坐标下降。
  4. 稳定性选择的边池(Meinshausen & Bühlmann 2010):48 次子采样拟合中,边必须被选中超过 1/3 次才保留(真实边都 ≥17/48,伪边都 ≤16/48,无需每数据集调参)。

结果

Total SHD
1
最佳 baseline BOSS = 24
ER10 / ER20 / SF50
SHD = 0
完美还原
SF50-Hard
SHD = 0
BOSS 在这里 SHD=6
ER20-Noisy
SHD = 1
唯一没完美的场景

总 SHD = 1,把官方最佳 baseline(BOSS 24)从 24 降到 1,也比之前所有 agent 解(最好 7)好得多。 唯一的残差是一条弱边(2→19,权重 0.35,噪声 2.5,样本 400)方向判反——这是统计极限,数据本身几乎不携带方向信息。

中间发生了什么(可观测量的使用)

这个任务是「观察中间量 → 提取 insight → intervention」的教科书案例。
◆观察中间分数面:agent 发现对单条弱边,pooled likelihood 分数面几乎是平的(两种方向的分数差 < 统计噪声),这是"为什么 greedy 会翻车"的直接观察。
◆观察 bootstrap 投票分布:它打印了 24 次 bootstrap 里每条边支持"正确方向"的票数(20/24–21/24 vs 分数偏向错误方向),据此设计了「2-se 检验」来决定是否采用细化顺序。
◆观察边选择的稳定性:48 次子采样中每条边的选中次数(真实边 ≥17/48、伪边 ≤16/48),据此定 1/3 阈值——这是从数据里"数"出来的规律,不是拍脑袋。
◆全场景本地评测:agent 在改完每个组件后都跑一次全部 5 场景,看 SHD 怎么变化,逐项归因。
展开:实际 trajectory 摘录(来自 session 日志)
# 先读任务说明和 baseline 结构
[read] task_description.md
[read] custom_algorithm.py

# 观察:检验等方差假设是否真的可识别(写小实验验证 Σ⁻¹ 分解)
[bash] python -c "import numpy as np; ... 验证 (I-B)T(I-B)/sigma2 分解..."

# 观察:对每条边做 bootstrap 方向投票,看弱边的分布
[bash] python -c "bagged leaf peeling on bootstrap resamples ... 20/24 votes vs score"

# 观察:48 次子采样稳定性的直方图
[bash] python -c "stability-selection ... true edges >=17/48, spurious <=16/48"

# 每改一版都全场景评测,看 SHD 变化
[bash] run_test.py causal-observational-linear-gaussian ... 
# → 最终:Total SHD = 1
关键点:agent 不是直接"梭哈"写一个算法,而是先做了两个中间观察(分数面平坦、bootstrap 投票分散), 基于观察设计了两层保护(bagged 顺序 + 2-se 检验),再用稳定性观察定阈值。最终把官方最佳从 24 打到 1。

02 causal-observational-linear-non-gaussian(LiNGAM)

任务背景

上一个任务(linear-gaussian)里我们说过:线性高斯模型下,如果噪声方差不等,因果方向不可识别(只能到 CPDAG)。 本任务打破了「高斯」这个假设——变量之间的机制仍是线性的,但噪声可以是非高斯的(比如均匀分布、t 分布等)。

LiNGAM(Linear Non-Gaussian Acyclic Model,线性非高斯无环模型,Shimizu et al. 2006)发现了一个漂亮的定理: 在线性 + 非高斯噪声的假设下,因果方向是完全可识别的,甚至可以恢复完整 DAG(不只是 CPDAG)。 直觉是这样:如果 X → Y(Y = aX + ε,ε 非高斯),那么「对 X 回归 Y 的残差」和「X」是独立的; 反之如果方向反了,「对 Y 回归 X 的残差」和「Y」会相关。利用独立性的不对称性就能定方向。

这个任务给 3 个场景:ER30、ER50(随机有向图,30/50 个节点)和 SF100(无标度图,100 节点), 官方 baseline(DirectLiNGAM、ICALiNGAM)在部分场景会有 2–6 条伪边。

任务内容与评测

项说明
输入3 个数据场景:ER30(30 节点随机图)、ER50(50 节点随机图)、SF100(100 节点无标度图)
agent 可改文件causal-learn/bench/custom_algorithm.py 的 run_causal_discovery()
评测指标SHD、F1、Precision、Recall(越低 SHD 越好,其余越高越好)
官方 baselineDirectLiNGAM(F1 0.99/0.99/0.99)、ICALiNGAM(0.995/0.994/0.82)、NOTEARS(更弱)

模型做了什么(Pruned DirectLiNGAM)

agent 实现的是 Pruned DirectLiNGAM——官方 DirectLiNGAM 的顺序搜索 + 一个统计剪枝的回归阶段:

  1. 因果顺序:标准的 DirectLiNGAM 迭代找 sink 节点(用 dMI 统计量度量非高斯独立性),向量化实现。
  2. 父节点集:每个变量对它在顺序中的前驱做 adaptive Lasso(BIC 选惩罚)。
  3. 创新点:留一法偏相关后向剪枝。关键 insight(来自中间观察):深链变量的边缘方差可以相差 150 倍, 这会让「边缘归一化统计量」把真正的父节点也剪掉。改用「残差的偏相关」——在 LiNGAM 独立性假设下有校准的空分布(τ = 3/√n)—— 能保留所有真父节点、同时删掉伪祖先。
  4. Refit:对剪枝后的支撑集做 OLS,删掉 |coef| < 0.25 的边(真实权重 ≥0.5 构造保证)。

结果

ER30
SHD = 0
DirectLiNGAM SHD=2
ER50
SHD = 0
DirectLiNGAM SHD=3
SF100
SHD = 0
DirectLiNGAM SHD=6
全场景
F1 = 1.0
官方最佳 F1 ≈ 0.99

三个场景全部 SHD = 0、F1 = 1.0(完美恢复真实 DAG),把官方 DirectLiNGAM 的残余错误(每场景 2–6 条伪边)全部消除。 运行时也快(9s / 22s / 87s)。

中间发生了什么(可观测量的使用)

这里最精彩的中间观察是:agent 观察到「边缘方差 150 倍差异」这个数据特性,并据此诊断出「为什么朴素剪枝会失败」。
◆观察残差相关性的失效模式:agent 在调试时打印了深链变量的边缘方差(发现差 150 倍), 解释了为什么 marginal-normalized 统计量会把真父节点剪掉。
◆观察偏相关的空分布:它验证了偏相关在 LiNGAM 假设下的 null 分布可用 τ=3/√n 校准, 然后据此设剪枝阈值。
◆观察剪枝前后伪边/真边变化:打印每一轮剪枝删掉了哪些边、保留哪些,逐条归因。
◆全场景评测验证:每轮改动后跑 3 场景,确认 SHD 从 2-6 降到 0。
展开:实际 trajectory 摘录
# 读任务、读现有实现
[read] task_description.md
[read] custom_algorithm.py

# 观察:跑官方 DirectLiNGAM 看残余错误在哪
[bash] run directlingam on ER30/ER50/SF100 → F1 0.99, SHD 2/3/6

# 观察:为什么会有伪边?打印深链变量方差 → 发现 150x 差距
[bash] python -c "check marginal variances along chains ... up to 150x"

# 干预:改用偏相关剪枝,验证空分布校准
[bash] python -c "partial corr null under LiNGAM ... tau = 3/sqrt(n) calibrated"

# 每版全场景评测
[bash] run_test.py causal-observational-linear-non-gaussian ...
# → SHD 0 / 0 / 0,F1 全 1.0
关键点:agent 从「方差 150x」这个数据特性出发诊断出算法失败根因,用「偏相关 + 校准空分布」做剪枝, 实现了官方 baseline 做不到的完美恢复。这是「观察数据内部结构 → 定位木桶短板 → 针对性修复」的典型循环。

03 causal-observational-nonlinear(非线性加性噪声因果发现)

任务背景

前两个任务都是「线性」机制。本任务把机制换成非线性:每个变量的值 = 父变量的非线性函数 + 加性噪声。 这是更接近真实世界的设定(比如基因调控、气候变量之间通常不是简单的线性关系)。

非线性带来了新的可识别性:加性噪声模型(ANM, Additive Noise Model)定理说明,在大多数非线性情况下, 因果方向是唯一可识别的。核心观察是:如果 X → Y(Y = f(X) + ε,ε 与 X 独立), 那么残差 Y − f(X) 与 X 独立;但反过来 X = g(Y) + ε' 的残差通常与 Y 不独立。 这种「方向不对称性」就是识别因果方向的钥匙。本任务即要求实现这样一个非线性因果发现算法。

3 个场景:SF20-GP(20 节点、高斯过程非线性)、ER20-Gauss(20 节点随机图、高斯噪声)、 ER12-LowSample(12 节点、样本很少)。官方最佳 baseline 是 CAM(F1 0.853/0.723/0.542)。

任务内容与评测

项说明
输入3 个非线性 ANM 数据场景(见上)
agent 可改文件causal-learn/bench/custom_algorithm.py 的 run_causal_discovery()
评测指标SHD、F1、Precision、Recall
官方 baselineCAM(F1 0.853 / 0.723 / 0.542)

模型做了什么(ANM-GAM)

360 上跑的 agent 实现了 ANM-GAM,一个完整的非线性 ANM 因果发现流水线:

  1. 成对方向打分:对每个有序变量对 (p, c),用三次样条岭回归拟合 c ~ f(p),再用快速随机傅里叶特征 HSIC 度量残差与 p 的依赖度。残差依赖小 ⇔ 这个方向符合 ANM。
  2. 用 IC 模型比较学顺序:给候选拓扑顺序(自然顺序、成对 ANM 投票的贪心聚合、以及其逆序)打「稀疏加性模型的组 BIC/AIC」分,取最小。数据驱动的比较在每个场景都以很大优势选对顺序。
  3. 稀疏加性父节点选择:对样条基做带组惩罚的贪心前向选择(n≥500 用 BIC,小样本用 AIC + 留一 F 检验后过滤);所有岭回归都用预计算的 Gram 矩阵,搜索近乎瞬时。

结果

SF20-GP
F1 = 0.986
baseline CAM 0.853
ER20-Gauss
F1 = 0.957
baseline CAM 0.723
ER12-LowSample
F1 = 0.973
baseline CAM 0.542
耗时
7s / 7s / 2s
每场景

三个场景的 F1 都远超官方最佳 baseline(CAM)。剩余的错误是 SNR < 0.1 的极弱边,接近检测极限。 这是 360 机器的结果,**全程只用了 28 分钟**。

中间发生了什么(可观测量的使用)

这个任务的 trajectory 是「原型开发 + 大量中间统计量观察」的范本——agent 在 /tmp/dev 里写了 20+ 个原型/调试脚本。
◆观察 HSIC 子采样对方向判定速度/准确度的影响:专门写脚本对比不同子采样量,在保持准确度下提速。
◆观察「BIC 前向选择 vs 残差方差打分」谁更能选对顺序:发现残差方差打分会被「后代伪装成父节点」欺骗,而 BIC 前向选择的景观是可靠的顺序判据。
◆观察 CAM 风格 F 检验剪枝 vs 组 IC 前向选择:实测发现前者远逊于后者,据此替换。
◆观察岭惩罚大小对弱边的影响:α=0.01 能找回重收缩丢失的弱边。
◆低样本场景专项观察:小样本需要 AIC + 更少节点 + F 检验后过滤,逐项调。
展开:360 机器上的实际 trajectory 摘录(会话日志)
# 先摸清环境(没有 conda、没有 sklearn 时的应对)
[bash] which python3 python3.11 python3.10 conda; ls /usr/bin/python* /opt/conda/bin/python*

# 原型开发:load_data → proto1 → proto2(GAM 残差方向打分)
[script] /tmp/dev/load_data
[script] /tmp/dev/proto1
[script] /tmp/dev/proto2

# 观察:proto2 的成对方向分数在不同设置下是否稳定
[bash] python3 -c "run proto2 on SF20/ER20/ER12 ..."

# 观察:HSIC 子采样对方向判定速度/准确度影响
[bash] python3 -c "speed-check HSIC subsampling impact on pairwise orientation ..."

# 观察:RFF-HSIC 变体(随机傅里叶特征)提速
[script] /tmp/dev/rffhsic
[script] /tmp/dev/pipeline3

# 观察:前向选择 vs 残差方差打分,谁更会选顺序
[bash] timeout 400 python3 -c "forward-selection BIC landscape vs residual-variance ..."

# 观察:前向/后向选择对比(forward_select vs backward_select)
[script] /tmp/dev/selback
[bash] sed -i "s/def backward_select/.../" 

# 定稿:写 custom_algorithm.py,全场景评测
[write] custom_algorithm.py
[bash] run_test.py causal-observational-nonlinear ...
# → SF20 F1 0.986, ER20 0.957, ER12 0.973(28 分钟完成)
两机对比的重要教训:同样的任务,ophis 上的 agent 写了一个贪心搜索实现,评测时每个场景超过 7500 秒(评测超时判无效,未拿到 METRICS); 而 360 上的 agent 用 Gram 矩阵预计算 + 稀疏加性模型,每场景只要 2–7 秒,28 分钟就拿到了优秀结果。 这告诉我们:在 autoresearch 里,「算法的计算效率」本身就是需要被观察和优化的中间量——跑得太慢会直接浪费评测预算甚至评测失败。

04 causal-discovery-discrete(离散贝叶斯网络因果发现)

任务背景

前面几个因果任务处理的是连续变量。本任务处理离散数据:每个变量的取值是有限个离散类别 (比如「是/否」、五个风险等级),变量之间的关系用贝叶斯网络(有向无环图 + 每个节点的条件概率表)建模。 这类网络在医学(如 Cancer、Alarm 是著名的医学诊断网络)、专家系统中非常常见。

任务给 5 个经典的贝叶斯网络:Cancer(5 节点,小)、Child(20 节点)、Alarm(37 节点)、 Hailfinder(56 节点)、Win95pts(76 节点,Windows 95 打印机故障诊断网络)。 你只拿到从网络采样出的观测数据(离散样本),要还原出真实的有向图。样本量有限(大网络只有几百条), 所以这是有挑战的。官方 baseline 是 PC、GES、GRaSP、BOSS、HC 这些经典算法。

任务内容与评测

项说明
输入5 个离散贝叶斯网络的观测数据(样本从网络采样)
agent 可改文件causal-bnlearn/bench/custom_algorithm.py
评测指标每个网络一个 SHD(越低越好)+ Adj/Arrow Precision/Recall,总计 SHD 求和
官方 baselinePC(122)、GES(101)、GRaSP(112)、BOSS(98)、HC(212)——括号内是 5 网络总 SHD

模型做了什么(C-DAG 算法)

360 上跑的 agent 实现了一个混合算法 C-DAG(Consensus-skeleton-constrained Greedy Equivalence Search):

  1. 双证据候选骨架:用 stable-PC 分别用 χ² 和 G² 两种统计量、多个 α 水平跑条件独立性检验(取并集), 再加「参数校准的分数证据」——只有超过「每父先验 × 边自由度」的 BDeu 分数增益才接受。这让分数证据在二值网络上可靠(Win95pts),同时避免高基数过拟合(Hailfinder)。
  2. 骨架受限的 GES:在候选骨架上做前向/后向贪心等价类搜索(BDeu 分数),把 Insert 操作限制在候选骨架对上, 使 GES 在 56–76 节点的网络上可运行(原生 GES 在这里会超时)。再加一个「分数补全轮」把边界证据边纳入。
  3. 自包含向量化 numpy BDeu 计分器:vendored 的 pandas 计分器在运行环境崩溃,agent 自己重写了一个。

结果

Cancer / Child / Alarm
SHD 4 / 5 / 5
baseline 3 / 5 / 4
Hailfinder / Win95pts
SHD 39 / 43
baseline 35 / 38
Total SHD (360)
96
BOSS=98 GES=101 GRaSP=112
Total SHD (ophis)
90
比 360 更好

360 版总 SHD = 96,击败所有官方 baseline(BOSS 98、GES 101、GRaSP 112、PC 122、HC 212)。 ophis 版更优,总 SHD = 90(Cancer 3、Child 5、Alarm 4、Hailfinder 38、Win95pts 40)。 这是两个独立 agent 各自写的算法,都超过了官方最佳。

中间发生了什么(可观测量的使用)

agent 在 /tmp 写了 8+ 个 debug 脚本,迭代历史清晰可见:贪心 BDeu → 受限 GES → 校准双证据骨架。
◆观察「原生 GES 在 76 节点上超时」:这是推动「骨架受限 GES」的直接观察。
◆观察 BDeu 在高基数网络(Hailfinder)的过拟合:发现「分数增益」需要按边自由度校准,Hailfinder SHD 从 56 → 39。
◆观察 CI 检验在二值数据(Win95pts)的多重检验召回损失:用双统计量(χ² 和 G²)取并集弥补。
◆观察每个网络的 Adj/Arrow Precision 分项:逐网络诊断瓶颈(比如 Cancer 只有 4 条边可识别,因为真实状态出现率极低)。
◆vendor BDeu 计分器崩溃:agent 观察到此崩溃后自己重写向量化版本,而不是绕开。
展开:360 机器实际 trajectory 摘录
# 读任务说明 + 现有实现 + 评测 harness(花了很多功夫理解评测怎么跑)
[read] task_description.md
[read] custom_algorithm.py
[bash] cat run_test.py | head -120

# 环境侦察:找 python 和 causallearn/bnlearn 库
[bash] which python python3; python3 -c "import causallearn; ..."
[bash] ls miniconda3/envs/; .../mlsbench-causal-bnlearn/bin/python -c "import causallearn ..."

# 第一版:per-node greedy BDeu(邻接好、方向差)
[write] custom_algorithm.py
[script] /tmp/debug1 .. /tmp/debug4   # 观察:为什么方向差

# 第二版:restricted GES(方向修好了;Hailfinder/Win95pts 召回缺口)
[script] /tmp/debug5 .. /tmp/debug8   # 观察:各网络 SHD 明细

# 第三版:校准双证据骨架 + 补全(Hailfinder 56→39, Win95pts 44→43)
[script] /tmp/prof1 /tmp/prof2        # 性能剖析:提速
[bash] run_test.py causal-discovery-discrete ...
# → Total SHD = 96(击败所有 baseline)
关键点:这个任务展示了 agent 的迭代式 debugging 能力——它先做一个能跑的版本,然后用中间指标 (各网络 SHD 分项、方向 vs 邻接错误)定位瓶颈,逐轮加组件(GES 定方向、校准分数修高基数、双统计量修二值)。 两个独立 agent(360 和 ophis)都做到了超过官方最佳,说明这不是运气。

05 causal-treatment-effect(因果处理效应估计)

任务背景

这是因果推断里的「黄金问题」:估计处理效应(treatment effect)。 场景是:有一群人,一部分接受了某种处理(吃药、广告、政策),另一部分没有。我们想回答: 「如果给每一个人都施加处理,效果会怎样?」——这叫个体处理效应(ITE), 以及「平均下来效果多大?」——这叫平均处理效应(ATE)。

难点在于反事实缺失:一个人要么被处理、要么没被处理,我们永远看不到「如果他走了另一条路会怎样」。 所以必须用统计方法(倾向性得分、双重稳健估计、元学习器等)来抵消选择偏差。 本任务用 3 个合成数据集:IHDP(母婴健康干预,经典基准)、Jobs(工作培训计划)、ACIC(大样本)。 每个数据集同时报 PEHE(个体效应估计误差)和 ATE error(平均效应误差)。

任务内容与评测

项说明
输入3 个合成数据集:IHDP、Jobs、ACIC(各有特征 X、处理 T、结果 Y)
agent 可改文件causal-learn/bench/custom_algorithm.py 里的 CATE 估计器
评测指标PEHE(个体效应误差,越低越好)、ATE error(平均效应误差)
官方 baselineS-Learner、T-Learner、X-Learner、R-Learner、因果森林(causal_forest)等
评测代价单次评测约 1.5–2 小时(10 重复 × 5 折交叉验证,3 数据集合计 ~7000s)——全任务里最贵的评测

模型做了什么(VARDR-X)

agent 实现了一个复杂的 CATE 估计器 VARDR-X(Variance-Adaptive Robust Doubly-Robust):

  1. 异方差感知的正交权重:最终 CATE 回归用 w = (T−e)²/√σ̂²(X),其中 σ̂²(X) 是交叉拟合的条件方差模型。
  2. 信息量与可靠性自适应的 R/DR 伪结果混合:DR-learner 的份额随倾向性可靠性和结果模型的信息量增长;弱臂/高维设置退回到稳定的 R 残差。
  3. 倾向性分层 winsorization:对伪结果的尾部按倾向性分层层截断(尾部集中在极端倾向层)。
  4. 集成:正则化 HistGBM + RF + Robinson 残差校正成员 + X-learner 成员 + 线性自适应多项式岭锚点。
  5. 鲁棒 ATE 校准:集成均值锚定到 AIPW 和 Robinson ATE 的逆方差混合(两者偏置模式相反)。

结果

IHDP PEHE
0.800
最佳 baseline 0.771 (causal_forest)
Jobs ATE error
25.9
最佳 baseline 35.3 —— 全场最佳
ACIC PEHE
0.463
最佳 baseline 0.421 (r_learner)
总体
6 项中 5 项第 2
介于 r_learner 与 causal_forest 之间

结果中等偏上:Jobs ATE error 击败所有 baseline,其余 5 项指标都是第 2 名(略逊于最佳 baseline)。 这是 13 个任务里 agent 提升最小的一个——原因是评测太贵(单次 2 小时),agent 只做了 3–4 次官方评测, 迭代空间被压缩。它用「本地留出 Robinson 风险代理」来弥补,把 IHDP PEHE 从 0.842 降到 0.800。

中间发生了什么(可观测量的使用)

这个任务展示的是「评测很贵时,agent 如何用廉价的中间代理指标替代」——这是非常实用的 autoresearch 技巧。
◆本地留出 Robinson 风险代理:因为官方评测一次要 2 小时,agent 自己实现了「留出 Robinson 损失」作为快速代理(几分钟),用来在迭代中比较不同版本,只在有把握时跑官方评测。
◆观察 ACIC 上纯 DR-learner 的 gap:发现弱臂/高维设置下纯 DR 会崩,据此加 R/DR 自适应混合。
◆观察倾向性极端的伪结果尾部:发现尾部集中在极端倾向层,据此做分层 winsorization。
◆OpenMP 线程卫生:192 核主机上多线程竞争导致评测变慢,agent 设置 PASSIVE wait 策略,让评测在预算内跑完。
◆样本量自适应计算预算:10 重复 × 5 折交叉验证的计算量巨大,agent 做了样本量自适应的预算控制,确保单条命令不超时。
展开:实际 trajectory 摘录
# 读任务 + 读 placeholder(S-Learner)
[read] task_description.md
[read] custom_algorithm.py

# 观察:评测很贵(2h/次),先做一个本地快速代理
[bash] implement local out-of-sample Robinson-risk proxy (minutes)

# 迭代:v1 纯 DR → 在 ACIC 上观察 gap → 加 R/DR 混合
[bash] run proxy on IHDP/Jobs/ACIC ... ihdp PEHE 0.842 → 0.800

# 观察:192 核主机线程竞争 → OpenMP PASSIVE wait
[bash] fix thread hygiene, sample-adaptive budget

# 仅 3-4 次官方评测(太贵,省着用)
[bash] run_test.py causal-treatment-effect ...
# → Jobs ATE error 25.9(全场最佳);其余 5 项第 2
关键点:当「评测成本」成为瓶颈时,agent 的自适应是——构造廉价的代理指标 + 本地验证 + 只在关键节点跑贵评测。 这也暴露了当前 harness 的一个局限:评测太贵的任务限制了 agent 的迭代次数,是未来值得优化的方向(比如增量评测、部分折叠评测)。

06 ml-symbolic-regression(符号回归)

任务背景

符号回归(Symbolic Regression)的目标是:给定一组 (输入, 输出) 数据点,找到一个数学表达式(而不是一个黑盒神经网络)来解释它们。 比如给你一堆 (x₀, x₁, y) 的数据,你要发现 y = 2·sin(x₀)·cos(x₁) 这个公式。 它和「曲线拟合」的区别在于:输出是可读的公式,而不是一堆权重。

主流的求解工具是遗传编程(Genetic Programming, GP):维护一群表达式(程序树),通过「变异/交叉」演化、 「适应度」选择,逐渐逼近正确答案。本任务用 3 个经典基准:nguyen7(单变量外推)、nguyen10(双变量周期函数)、 koza3(经典 Koza 基准)。评测指标是测试集 R²。

任务内容与评测

项说明
输入3 个基准的数据点(训练/测试划分):nguyen7、nguyen10、koza3
agent 可改文件gplearn/custom_sr.py(gplearn 库的可编辑部分)
评测指标每个基准的测试 R²,任务分 = 几何平均
官方 baseline标准 GP、带简洁性压力的 GP、ε-lexicase GP(0.9977/0.8836/0.9855 等)

模型做了什么(Memetic ε-Lexicase GP)

agent 在 gplearn 里实现了一个混合 GP 搜索策略:

  1. 适应度塑造:归一化 MSE + 线性简洁性压力 + 平滑性正则化(拒绝高频插值——那些在训练点上穿行、但在留出点上震荡的坏表达式)。
  2. 选择:混合 ε-lexicase / 锦标赛。Lexicase 用 MAD 半动态 epsilon 对每个样本的误差做逐样本比较;锦标赛用带简洁惩罚的适应度。可退火混合。
  3. 算子:六种结构化变异(子树/点/常数扰动/常数插入/提升/折叠)+ 轻度代数化简 + 深度检查的交叉。
  4. Memetic 步:线性缩放修复嵌入树中 + 坐标下降常数爬山 + scipy 非线性最小二乘常数拟合(对结构有希望的精英)。
  5. 多样性维护:自适应算子率(适应度多样性崩溃时提高变异率)+ 每代 ~8% 随机移民。

结果

nguyen7
R² = 0.9980
最佳 baseline 0.9984
nguyen10
R² = 1.0000
精确找到 2·sin(x₀)·cos(x₁)
koza3
R² = 0.9984
最佳 baseline 0.99998
几何平均
0.9981
最佳 baseline 0.9952

三任务几何平均 0.9981 > 最佳 baseline 0.9952,并且 nguyen10 精确恢复出真实公式。 360 上的 agent 也达到了 R² = 0.9988/1.0/0.9995,两个独立运行都很好。

中间发生了什么(可观测量的使用)

这个任务是「系统性扫描 + 泛化观察」的典型——agent 大量使用了多 seed、超参网格、逐样本误差分析。
◆多 seed 扫描:SEEDS=42,123,456 系统性跑,确认跨 seed 稳定而非单次运气。
◆超参网格:LEX_FRACS=0.3/0.5/0.7、LEX 退火调度、K_ELITES 等,每个配置看 sweep 日志里的 test R²。
◆逐样本误差观察:lexicase 的本质就是看「每个样本上的误差」,agent 观察到 nguyen7 上纯 lexicase 会过拟合 20 个点的外推问题,所以加简洁锦标赛 + 平滑正则。
◆cProfile 性能剖析:定位遗传演化的性能瓶颈并优化。
◆观察表达式形态:nguyen10 上观察到结构命中(2·sin·cos),用 NLS memetic 精修常数。
展开:实际 trajectory 摘录
# 读任务 + 读 gplearn 模板
[read] task_description.md
[read] custom_sr.py

# 观察:跑官方 baseline 看差距
[bash] run standard GP / parsimony / lexicase on 3 benchmarks

# 观察:纯 lexicase 在 nguyen7 上过拟合(20 点外推)
[bash] run lexicase alone → nguyen7 test R² drops

# 干预:加简洁锦标赛 + 平滑正则 + memetic 常数拟合
[bash] sweep LEX_FRACS / K_ELITES / seeds 42,123,456 → track test R²

# 观察:nguyen10 结构命中,NLS 精修常数 → R²=1.0
[bash] cProfile 定位瓶颈 → 优化
[bash] run_test.py ml-symbolic-regression ...
# → gmean 0.9981(nguyen10 精确恢复公式)
关键点:agent 的关键洞察来自「观察每个样本的误差分布」——lexicase 选择的逐样本压力让它在 nguyen10 上发现精确周期结构, 但同样的压力在 nguyen7 上导致过拟合。agent 用「混合选择 + 平滑正则 + 多 seed 验证」来平衡,最终双机都稳定超过 baseline。

07 ml-anomaly-detection(异常检测)

任务背景

异常检测(Anomaly Detection)的目标:从一堆数据里找出「不正常的点」——比如信用卡欺诈、网络入侵、传感器故障。 难点是异常点极其稀少(可能只占 1–30%),而且我们通常没有标签(无法监督学习), 只能靠「正常数据长什么样」来推断哪些点偏离了正常模式。

本任务用 ADBench 的 4 个标准数据集:cardio(心脏病监测,异常 9.6%)、thyroid(甲状腺,2.5%)、 satellite(卫星影像,31.6%——异常占比非常高,极难)、shuttle(航天飞机,7.2%)。 评测用 AUROC 和 F1(在最优阈值下)。官方 baseline:Isolation Forest、One-Class SVM、ECOD、COPOD、LOF 等。

任务内容与评测

项说明
输入4 个 ADBench 数据集(60/40 划分,训练无标签)
agent 可改文件scikit-learn/custom_anomaly.py
评测指标每数据集 (AUROC+F1)/2,任务分 = 几何平均
官方 baselineiForest(0.9446/0.5571…)、OCSVM、ECOD、COPOD、LOF——各数据集强弱不同

模型做了什么(CRC:Contamination-robust Consensus scoring)

agent 实现了一个全新的异常打分器 CRC(Contamination-robust Consensus scoring,抗污染共识打分):

  1. RGM:稳健高斯模型。用迭代重加权最小二乘(Huber 风格软截断)重估位置/散布,让异常点被降权而不是污染正常模型。
  2. cHRGM:约束稳健高斯混合。自动决定混合分量数(权重必须都超过下限,拒绝吸收异常簇的伪小分量),每个分量用同样的重加权最小二乘。这让密度视图在 ~30% 污染(Satellite)下依然可靠。
  3. 自适应排序聚合:8 个视图(IForest、PCA、ECOD、OCSVM、RGM | HBOS、cHRGM、KDE)各自打排序分,统一化后做「精度共识 P」和「密度共识 D」(幂均值 p=3)的软 max 混合(temperature 10)——让最强的共识在它对的地方主导,同时不让单一噪声视图赢。

结果

cardio
AUROC 0.9275
iForest 0.9446
thyroid
AUROC 0.9800
iForest 0.9806
satellite
AUROC 0.7764
ECOD 0.5853 —— 大幅超越
shuttle
AUROC 0.9961
iForest 0.9965

任务分 0.7982(seed 42)。最大亮点是 satellite:31.6% 污染的极端场景下,AUROC 0.7764 远超所有 baseline (ECOD 0.585、COPOD 0.634、iForest 0.7135)。这是「稳健高斯 + 抗污染共识」直接针对高污染场景设计的成果。 其余数据集与最佳 baseline 持平(±0.02)。

中间发生了什么(可观测量的使用)

agent 先做了数据诊断,观察各 baseline 的失效模式,再针对性地设计。
◆观察各 baseline 在 4 个数据集上的诊断:发现「没有单一经典检测器能赢所有数据集」——LOF/ECOD 在某些数据有毒(cardio 上 LOF AUROC 0.62、ECOD satellite 0.585),而稳健高斯混合是唯一能处理 Satellite 31.6% 污染的方法。
◆观察污染率对模型的影响:~30% 污染会让普通高斯混合把异常簇吸收为正常分量,据此加「权重下限」约束。
◆观察每个视图的排序一致性:设计「精度共识 P + 密度共识 D」软 max 混合,避免单一噪声视图主导。
展开:实际 trajectory 摘录
# 读任务 + 读模板(iForest wrapper)
[read] task_description.md
[read] custom_anomaly.py

# 观察:跑所有 baseline 看 4 个数据集的强弱分布
[bash] run iForest / LOF / OCSVM / ECOD / COPOD on cardio/thyroid/satellite/shuttle

# 观察:Satellite 31.6% 污染下普通模型崩溃
[bash] GaussianMixture on satellite → absorbs anomaly cluster as normal component

# 干预:RGM 重加权 + cHRGM 权重下限 + 8 视图共识
[bash] implement CRC, test per-dataset AUROC/F1

# 全场景评测
[bash] run_test.py ml-anomaly-detection ...
# → 0.7982(satellite 0.7764 远超 baseline)
关键点:agent 通过对 4 个数据集的 baseline 诊断,识别出「高污染(Satellite)是所有人失败的共同点」这个木桶短板, 然后专门为它设计抗污染组件(RGM + cHRGM),同时用共识聚合保持其他数据集不退化。

08 ml-clustering-algorithm(聚类)

任务背景

聚类(Clustering)的目标:给一堆没有标签的点分组,让「组内的点相似、组间的点不同」。 这是最基础的无监督学习问题——客户分群、图像分割、文档归类都用它。

本任务有 3 个数据集,难度差异很大:blobs(球形簇,简单)、moons(两个月牙形,非凸——K-Means 会失败)、 digits(手写数字 64 维,高维流形)。评测指标:ARI(聚类与真实类别匹配度)、NMI(互信息)、 Silhouette(轮廓系数)。官方 baseline 就是 K-Means(ARI 0.935/0.481/0.534)。

任务内容与评测

项说明
输入3 个数据集:blobs(1500 点 2 维)、moons(1000 点 2 维)、digits(1797 点 64 维)
agent 可改文件scikit-learn/custom_clustering.py
评测指标每数据集 ARI、NMI、Silhouette,任务分 = 几何平均
官方 baselineK-Means(ARI 0.935/0.481/0.534)

模型做了什么(MUSES:Multi-Scale Spectral Ensemble)

agent 实现了一个三阶段算法 MUSES(Multi-Scale Spectral Ensemble with Consensus Refinement,多尺度谱聚类集成 + 共识精修):

  1. 多尺度谱视图:在 kNN 高斯亲和图上跑归一化谱聚类,多个尺度(高维 d>10 用 {3,5,10},低维用 {7,8,10}),自适应选择。
  2. 标签空间证据累积:对多个尺度的分区做匈牙利对齐的逐元素多数投票(O(m·n·k) 共识,对谱聚类对图尺度的敏感性鲁棒;≥3 个视图保证真有大多数)。
  3. 邻域共识精修:标签传播去噪——把每个点重新指派到其 kNN(k=5)的大多数标签,清除孤立误分(ARI/NMI 最惩罚这种)。

K-Means 只作为安全网和自动估计簇数。

结果

blobs ARI
0.936
K-Means 0.935
moons ARI
1.000
K-Means 0.481 —— 完美
digits ARI
0.750
K-Means 0.534
任务分
gmean 0.730
K-Means 0.556(+31%)

最大提升在 moons(ARI 0.481 → 1.0,完美)和 digits(0.534 → 0.750)。blobs 与 baseline 持平。 关键洞察:K-Means 对非凸(moons)和高维流形(digits)都会失败,而 kNN 图谱聚类能抓住两者。

中间发生了什么(可观测量的使用)

agent 观察到「单一尺度的谱聚类会在某个 seed 上塌缩」(moons seed 123 → ARI 0.02),这是设计多尺度投票的直接动因。
◆观察单尺度谱聚类的塌缩:nn=7 在 moons seed 123 上 ARI 跌到 0.02,说明单一图尺度不可靠 → 设计奇数个多尺度投票。
◆观察边界误分:kNN 共识平滑把 digits NMI 提高 ~0.01 且不损失轮廓。
◆多 seed 稳定性验证:跨 seed 和随机状态确认增益稳定。
展开:实际 trajectory 摘录
# 读任务 + 读 K-Means 模板
[read] task_description.md
[read] custom_clustering.py

# 观察:K-Means 在 moons / digits 上失败(ARI 0.48 / 0.53)
[bash] run KMeans on blobs/moons/digits → ARI 0.935/0.481/0.534

# 观察:单尺度谱聚类在 moons seed 123 塌缩(ARI 0.02)
[bash] run spectral nn=7 on moons → collapses

# 干预:多尺度投票 + kNN 共识精修
[bash] implement MUSES, test per-dataset ARI/NMI/sil

# 全场景评测 + 多 seed 验证
[bash] run_test.py ml-clustering-algorithm ...
# → moons 1.0(完美),digits 0.75,gmean 0.730(+31%)
关键点:agent 通过观察「单尺度塌缩」这个失败模式,设计出多尺度共识来消除它;又通过观察「边界误分」用 kNN 平滑精修。 两个观察都直接来自运行中间结果。

09 ml-dimensionality-reduction(降维)

任务背景

降维(Dimensionality Reduction)的目标:把高维数据(比如 28×28 像素的手写数字 = 784 维)压缩到 2–3 维, 同时尽量保留数据结构,让人类可以可视化、或者让后续算法更快。最著名的工具是 t-SNE 和 UMAP。

本任务 3 个数据集:MNIST(手写数字 784 维)、Fashion-MNIST(服装图片 784 维)、newsgroups(新闻文本 50 维)。 评测指标是降维后邻居保持质量:kNN accuracy(降维后分类准不准)、trustworthiness(可信度——降维后成为邻居的点在原空间是否也近)、 continuity(连续性——原空间邻居在降维后是否还近)。官方 baseline 是 t-SNE。

任务内容与评测

项说明
输入3 个高维数据集(784/784/50 维 → 降到低维)
agent 可改文件scikit-learn/bench/custom_dimred.py
评测指标每数据集 kNN acc、trustworthiness、continuity
官方 baselinet-SNE(MNIST knn 0.868 / trust 0.963 / cont 0.966)

模型做了什么(APNE:Adaptive-Perplexity Neighborhood Embedding)

agent 实现了一个新的非线性嵌入算法 APNE:

  1. 维度自适应 perplexity:对称高斯亲和力,高维输入(像素,d≥100)perplexity=20,低维(newsgroups,d=50)perplexity=30。更紧的局部模型让 k=7 邻域(评测所量的)保持锐利。
  2. 稀疏精确吸引 + 周期精确排斥:吸引是每个点 top-60 亲和力上的精确计算;t-SNE 的全体对 (1+d²)⁻² 排斥(带配分函数 Z)每 8 次迭代重算一次(「排斥外推」:场是 1/d⁴ 衰减的对项之和,平滑,旧刷新只是微小误差;把 O(n²) 排斥成本砍 8 倍同时保持精确梯度质量)。
  3. 优化器:每坐标增益 + 动量、early exaggeration (α=12)、自动学习率 max(n/48, 50)、PCA 初始化。
  4. 环境修复:把 20newsgroups pickle 回填到固定的 SKLEARN_DATA_HOME,让 newsgroups 评测离线可跑。

agent 还试过「持久非归一化排斥地板 + 约束弹簧」(crowding 修复),但实验显示它会牺牲 trustworthiness(产生簇尾),所以被移除——这是「试了 → 观察到副作用 → 否决」的典型路径。

结果

MNIST kNN
0.875
t-SNE 0.868(+0.007)
Fashion kNN
0.775
t-SNE 0.780(略低)
Newsgroups kNN
0.690
t-SNE 0.686(+0.004)
trust/cont
≈ baseline
Fashion trust 0.977 vs 0.980

结果接近 t-SNE 且小有提升:MNIST kNN +0.007、newsgroups kNN +0.004,trustworthiness/continuity 持平。 这是「在成熟算法(t-SNE)上做边际改进」的任务——agent 的 APNE 用周期精确排斥把 O(n²) 成本砍 8 倍, 同时保持甚至略微超过 t-SNE 质量。单数据集运行 3.5–4.5 分钟。

中间发生了什么(可观测量的使用)

这个任务的亮点是「实验 → 观察副作用 → 主动否决」的完整闭环。
◆观察 crowding 修复的副作用:持久排斥地板 + 约束弹簧让 kNN 微升,但 trustworthiness 持续下降(产生簇尾),agent 实测后主动移除。
◆观察 perplexity 对邻域分辨率的影响:高维用 20、低维用 30,让 k=7 邻域更锐利。
◆观察排斥外推的误差:1/d⁴ 衰减的场是平滑的,8 次迭代刷新一次误差极小,验证后可接受。
◆环境修复的观察:newsgroups 评测离线跑不了(缺 pickle),agent 定位并修复了 SKLEARN_DATA_HOME。
展开:实际 trajectory 摘录
# 读任务 + 读 t-SNE 模板
[read] task_description.md
[read] custom_dimred.py

# 观察:newsgroups 评测离线失败 → 回填 pickle 修复环境
[bash] backfill 20newsgroups pickle into SKLEARN_DATA_HOME

# 实验:crowding 修复(持久排斥地板 + 弹簧)
[bash] implement, measure → knn ↑ but trustworthiness ↓ (cluster tails) → REJECT

# 干预:维度自适应 perplexity + 周期精确排斥(8x 加速)
[bash] implement APNE, measure per-dataset knn/trust/cont

# 全场景评测
[bash] run_test.py ml-dimensionality-reduction ...
# → MNIST knn +0.007,newsgroups +0.004,trust/cont 持平
关键点:这个任务展示 agent 在成熟算法上的「边际改进 + 主动取舍」能力——它清楚每个改动在哪个指标上获益、在哪个指标上受损, 并敢于否决「局部变好但全局变差」的方案。

10 ml-calibration(概率校准)

任务背景

概率校准(Calibration)解决一个很实际的问题:模型说「我有 90% 的把握」,它真的 90% 时候是对的吗? 很多模型(尤其深度网络)会过度自信——它对很确定,但实际错的概率更高。校准就是把模型输出的置信度 调整到「和真实正确率一致」。

本任务 4 个场景:rf-mnist(随机森林+手写数字)、mlp-fashion_mnist(神经网络+服装)、 gbm-madelon(梯度提升+高维)、svm-breast_cancer(SVM+小样本乳腺癌,只有 ~110 校准样本)。 评测指标:ECE(期望校准误差,越低越好)、Brier 分数、NLL(负对数似然)。 官方 baseline:temperature scaling、Platt、isotonic 回归等。

任务内容与评测

项说明
输入4 个场景的模型预测 + 一个留出校准集
agent 可改文件scikit-learn/custom_calibration.py
评测指标每场景 ECE、Brier、NLL
官方 baselinetemperature、Platt、isotonic(ECE 0.0122/0.0091/0.0161/0.0188 等)

模型做了什么(ASMC:Adaptive Smooth Monotone Calibration)

agent 实现了一个自适应的两层校准估计器 ASMC,完全从留出校准集学习:

  1. 候选家族(全部单调,保证 argmax/准确率不变):temperature scaling(低方差锚)、beta 校准/多类 logistic、isotonic 混合(二值)、confidence-spline(多类,PCHIP 单调三次样条拟合 top-1 置信可靠曲线)。
  2. 内部模型选择:在校准集上做 2×5 折重复交叉验证,按池化 NLL 选;NLL 在最佳 3% 带内的候选都合格,选带内最强的单调校正。小样本(<100)退回 temperature scaling。

结果

rf-mnist ECE
0.0055
最佳 baseline 0.0122(-55%)
mlp-fashion ECE
0.0061
最佳 baseline 0.0091(-32%)
gbm-madelon ECE
0.0173
temp 0.0305(-43%)
任务分
~45.6
最佳单 baseline ~32.1

ECE 在 rf-mnist(-55%)和 fashion-mnist(-32%)大幅优于最佳 baseline;madelon 比 temperature 降 43%; 只在 NLL 上付出 1–6% 的微小代价。小样本 breast_cancer 安全退回 temperature。

中间发生了什么(可观测量的使用)

agent 通过观察「每个场景的残余误校准模式」来选择校准家族。
◆观察 RF 的欠自信、GBM 在 Madelon 的系统性误校准:不同模型误校准模式不同,单一家族不能通吃。
◆观察 CV-NLL 带对非参阶段的保护:小校准集(breast ~110 样本)下非参阶段会过拟合,用 3% NLL 带约束。
◆内部 2×5 折 CV 观察:在校准集上反复比较各候选,选最强单调校正。
展开:实际 trajectory 摘录
# 读任务 + 读模板
[read] task_description.md
[read] custom_calibration.py

# 观察:跑 temperature/platt/isotonic 看各场景 ECE
[bash] run baselines → observe residual miscalibration per setting

# 干预:实现候选家族 + 内部 CV 选择
[bash] implement ASMC, compare on internal CV holdout

# 全场景评测(两次官方运行验证可复现)
[bash] run_test.py ml-calibration ...
# → rf-mnist ECE -55%,fashion -32%,madelon -43%
关键点:agent 的关键能力是「按场景自适应」——通过观察各场景的误校准模式,用一个内部模型选择机制自动挑最合适的校准家族,而不是套一个固定方法。

11 ml-selective-deferral(选择性放权)

任务背景

选择性预测(Selective Prediction)/ 放权(Deferral)的场景:一个分类器在自动跑,但它可以在不确定的时候选择不预测, 把样本交给人类专家处理。目标是在「覆盖率」(处理多少比例的样本)和「风险」(预测错误的概率)之间做权衡。

本任务 3 个数据集:adult(收入预测)、compas(再犯风险评估)、law_school(法学院成绩), 每个都有敏感子群(按性别/种族分组)。目标是:在覆盖率 ~80% 的前提下,最小化预测风险, 同时子群之间不能差别太大(公平性)。官方 baseline:learned_deferral、覆盖率阈值等。

任务内容与评测

项说明
输入3 个数据集的预测 + 敏感子群标签
agent 可改文件scikit-learn/custom_selective.py
评测指标selective_risk@80(80% 覆盖率下的风险)、worst-group risk、deferral_rate_gap(子群间放权率差距)、coverage
官方 baselinelearned_deferral(≈0.299 归一化分)等

模型做了什么(校准的、风险感知的放权策略)

  1. 学习的接受分数:max-softmax +(可选)逻辑回归正确性模型 + 逐子群 isotonic 校准混合。在内部校准留出集上按 AUROC 选最好的候选(带保护边距);只有大校准集(n≥3000)才信任学习的候选,避免小集过拟合。
  2. 自适应覆盖率预算:只有当估计的池化选择性风险仍在名义覆盖率的容差内时,才把总预算放宽到 0.80 目标之上,补偿系统性的 cal→test 覆盖率欠冲(如 COMPAS),又不滑入高风险区。
  3. 风险感知的子群分配:逐组覆盖率目标在「全局风险最优阈值」和「等风险分配」(从单调平滑的逐组风险-覆盖率曲线做 minimax 最差子群风险)之间插值,用留出测得的覆盖漂移校正逐组阈值。

结果

adult risk@80
0.0728
worst-group 0.0975
compas risk@80
0.2828
worst-group 0.2956
law_school risk@80
0.3730
worst-group 0.4093
任务分
~0.465
最佳 baseline ~0.299

归一化任务分 ≈0.465,比最佳 baseline(learned_deferral ≈0.299)高约 55%。 三个数据集的 risk@80 都在合理范围,且最差子群风险与总体风险接近(公平性较好)。

中间发生了什么(可观测量的使用)

这个任务最突出的中间观察是「校准集 → 测试集的覆盖率欠冲」(COMPAS 上系统性的偏差)。
◆观察 cal→test 覆盖率欠冲:校准集上设 80% 覆盖率,测试集实际只有 ~78-79%,agent 用留出测得的覆盖漂移校正逐组阈值。
◆观察小校准集上学习式候选的过拟合:只在 n≥3000 才信任学习的接受分数。
◆观察子群风险-覆盖率曲线:单调平滑后用 minimax 求最差子群风险的均衡分配。
展开:实际 trajectory 摘录
# 读任务 + 读模板
[read] task_description.md
[read] custom_selective.py

# 观察:跑 baseline → COMPAS 覆盖率欠冲(0.80→~0.79)
[bash] run learned_deferral, measure coverage drift

# 干预:自适应覆盖率预算 + 风险感知子群分配
[bash] implement calibrated risk-aware policy, measure risk@80 / worst-group

# 全场景评测
[bash] run_test.py ml-selective-deferral ...
# → 任务分 ~0.465(baseline ~0.299)
关键点:agent 观察到「校准集和测试集的分布漂移」这个中间现象,并设计出「覆盖率漂移校正」来补偿——这完全靠观察中间统计量驱动。

12 ml-subgroup-calibration-shift(子群校准偏移)

任务背景

这个任务是「概率校准」的进阶版:不仅要让整体置信度准确,还要在每个子群里都准确(公平性), 并且要应对分布偏移(shift)——测试时的数据分布和训练时不一样了。

具体设定:3 个数据集(adult、compas、law_school),每个都按某个「域分数」的尾部切出测试集—— 这模拟了「模型在部署时遇到与训练不同的样本分布」的现实场景。要保证最差子群的校准误差(worst_group_ece)小、 子群之间差距小。官方 baseline 的 worst_group_ece 在 0.31–0.47,非常高(都很差)。

任务内容与评测

项说明
输入3 个数据集的模型预测 + 子群标签,测试集有偏移
agent 可改文件scikit-learn/custom_subgroup.py
评测指标worst_group_ece、brier、max_subgroup_gap
官方 baseline固定校准映射(worst_group_ece 0.348/0.466/0.310)

模型做了什么(BAG-CAL:Base-rate-anchored group beta calibration)

  1. 拟合:全局 beta 校准(在 [log p, log(1−p)] 上做逻辑回归)+ 逐组 beta 映射收缩到全局映射。
  2. 测试时基率锚定(关键创新):任务按「域分数尾部」切测试集,保留了全局类别平衡——测试基率 = 校准基率(构造保证)。 所以在预测时,把映射的 logit 截距平移,使「在观测到的测试概率分布上的平均校准概率」匹配已知基率(一维求根)。 这修正了偏移的主导误差(adult/law:测试概率上移 → 过度自信;compas:下移 → 欠自信)。逐组也用 James-Stein 收缩的组基率做同样锚定。
  3. 分布压缩:把输出向组基率收缩(权重 n_g/(n_g+k));小组(n<100)额外压缩。降低组内 top-label ECE。

结果

adult worst_group_ece
0.129
baseline 0.348(3.7×提升)
compas worst_group_ece
0.139
baseline 0.466(3.4×提升)
law worst_group_ece
0.094
baseline 0.310(3.3×提升)
max_subgroup_gap
0.049-0.107
baseline 0.109-0.264

每个数据集的每个指标都提升了 1.5–3.5 倍。剩下的 worst_group_ece 已经达到分箱估计器的小样本噪声地板。 这是 13 个任务里相对 baseline 提升最显著的之一(只在 31 分钟就完成)。

中间发生了什么(可观测量的使用)

关键中间观察是「偏移的方向是数据集特定的」——这是设计「基率锚定」的直接证据。
◆观察偏移方向的数据集特定性:adult/law 上测试概率上移(过度自信),compas 下移(欠自信)——固定的校准映射无法同时处理,因为方向相反。
◆观察「测试基率=校准基率」这个构造性质:利用域分数尾部切分保留类别平衡这个事实,用无标签的基率信号重新定层校准映射。
◆观察小组噪声:n<100 的小组 ECE 被噪声主导,用压缩处理。
展开:实际 trajectory 摘录
# 读任务 + 读模板
[read] task_description.md
[read] custom_subgroup.py

# 观察:跑固定校准 → 观察到偏移方向因数据集而异
[bash] run baseline → adult/law overconfident, compas underconfident

# 观察:测试基率 = 校准基率(构造保证)→ 可作为无标签锚
[bash] verify base rate preservation in split design

# 干预:实现 BAG-CAL(beta + 基率锚定 + 分布压缩)
[bash] implement, measure worst_group_ece / brier / gap

# 全场景评测(31 分钟完成)
[bash] run_test.py ml-subgroup-calibration-shift ...
# → 所有指标 1.5-3.5× 提升
关键点:agent 从「偏移方向因数据集而异」这个观察出发,利用评测构造的基率保持性质,设计出无标签的测试时锚定—— 这是「读懂评测设定 → 利用其结构 → 设计算法」的高级推理。

13 ai4sci-mol-property-prediction(分子性质预测)

任务背景

这是 AI for Science 任务:给定分子的2D 结构图(原子 + 化学键),预测它的某种物理化学性质 (比如水溶性、毒性、生物活性)。这是药物发现的基础步骤——先筛掉没希望的分子,再进实验室。

本任务用 3 个标准数据集:BBBP(血脑屏障穿透)、BACE(β-分泌酶抑制剂活性)、Tox21(21 种毒性)。 评测指标是每个数据集的 rocauc(ROC-AUC),任务分 = 几何平均。 官方 baseline 有:Uni-Mol(预训练 3D Transformer,rocauc 0.713/0.847/0.761)、D-MPNN(0.599/0.688/0.713)、GIN(0.510/0.726/0.747)。 任务允许的参数量上限是 Uni-Mol baseline 的 1.05 倍(~48.5M 参数)。

任务内容与评测

项说明
输入3 个数据集的分子 2D 图(含 3D 构象坐标和 Uni-Mol token)
agent 可改文件Uni-Mol/custom_molprop.py(可编辑部分)
评测指标每数据集 rocauc,任务分 = 几何平均
官方 baselineUni-Mol(0.713/0.847/0.761)、D-MPNN、GIN
评测代价每个数据集训练 40 epochs,单次全评测 ~1–2 小时

模型做了什么(GeoFusion-Mol:冷启动双视图 2D/3D 分子性质模型)

agent 用预训练 Uni-Mol 3D Transformer + 几何门控 2D 消息传递网络组了一个双视图模型:

  1. 3D 视图(预训练):Uni-Mol encoder(15 层、512 维、64 头),从 mol_pre_all_h_220816.pt 加载权重。 Token id 和 CLS/SEP 扩展距离矩阵从声明的 batch 字段向量化重建(因为评测 harness 的 dataclasses.replace 会丢动态属性), 并用参考管线的零行约定匹配预训练分布。Readout = CLS + masked-mean + pair-mean。
  2. 2D 视图(GeoMPNN):D-MPNN 风格的有向消息传递,每条化学键的消息被实测 3D 键长门控(高斯展开 → 学习的门), 让构象几何条件化 2D 消息流。
  3. 冷启动门控融合:逐维度软门混合 3D CLS 和 2D 表示。预测 = 直接的 CLS 头(初始与纯预训练 baseline 相同) + 零初始化的辅助头(带 stop-gradient,让 encoder 保持 baseline 的 CLS 微调轨迹,2D 分支只在能降低 loss 时介入)。
  4. 随机深度(drop-path 0.1)正则化深层 encoder。

结果

BBBP rocauc
0.7275
Uni-Mol 0.7129(+0.015)
BACE rocauc
0.8232
Uni-Mol 0.8466(略低)
Tox21 rocauc
0.7755
Uni-Mol 0.7613(+0.014)
几何平均
0.7744
Uni-Mol 0.7717

几何平均 0.7744 > Uni-Mol baseline 0.7717(best run)。BBBP 和 Tox21 显著提升(+0.015/+0.014), BACE 略低(-0.023)。第二次官方运行 0.7289/0.8037/0.7763(单次运行噪声 ±0.02)。 提升温和,但这是「在强预训练模型上做加法」的任务——agent 的贡献是让 2D 几何信息在不破坏预训练微调轨迹的前提下融入。

中间发生了什么(可观测量的使用)

这是全部任务里 debug 最深入的一个——agent 写了 20+ 个 probe / 单元测试脚本,逐层验证数据管线。
◆观察 token 重建正确性:tokens match pipeline: False → 逐原子对比,发现 dataclasses.replace 丢动态属性,改用向量化重建。
◆观察距离矩阵一致性:max dist diff (valid pairs): 9.999e-05(对齐验证,精确到 1e-4)。
◆观察原子数 vs token 数:n atoms lmdb: 50 n tokens: 52(+2 是 CLS/SEP)。
◆观察前向 shape:E 18 N 18 m (18,192) pad[src] (18,2)、output shape: torch.Size([3,3])。
◆观察随机模型 baseline:probe 随机初始化模型在验证集的 AUC,确认评测管道真实。
◆观察训练 loss:train step OK, loss: 0.6499、参数量 48,878,342(预算内)。
◆权重下载调试:github 直连失败 → 用 wget -c 断点续传 → hf-mirror,最终拿到 190.5MB 完整权重。
展开:实际 trajectory 摘录(这是全部任务里最长的 debug 过程)
# 阶段 0:环境与数据
[bash] 检查 lmdb 数据、权重文件是否存在
[script] probe_eval.py     # 验证评测管道:随机模型 AUC 是否真实

# 阶段 1:下载 Uni-Mol 预训练权重(190MB)
[bash] github 直连失败 → wget -c 断点续传 → hf-mirror → 完成
[script] probe_gin.py      # 单独测 GIN 分支

# 阶段 2:数据管线对齐(最艰难的 debug)
[bash] tokens match pipeline: False → 逐原子对比
[bash] max dist diff: 9.999e-05 → 距离矩阵对齐
[bash] n atoms 50 vs n tokens 52 → CLS/SEP 约定
[script] unit_test_*.py   # 写单元测试验证向量化重建

# 阶段 3:训练验证 + ablations
[bash] train step OK, loss: 0.6499
[script] ablation_dropout / ablation_cls_zero / ablation_no2d
[script] test_eval_replace_equivalence   # 验证有/无动态属性输出一致

# 阶段 4:定稿 + 全评测(agent 自己跑了多次官方评测)
[bash] run_test.py ai4sci-mol-property-prediction ...
# → gmean 0.7744 vs Uni-Mol 0.7717
关键点:这个任务证明了「必须看 observable 才能做事」——没有 token 重建的 probe 检查, agent 根本不可能发现 harness 丢动态属性这个 bug。它用了 20+ 个 probe/单元测试把整个数据管线拆开验证, 最后才放心地把 3D+2D 融合模型放上去训练。这正是「新 setting 里激进 debug」的范本。

14 ml-ensemble-boosting(集成提升)

任务背景

Boosting(提升)是把一堆「弱学习器」(比如很浅的决策树)串起来,每个新的学习器专门去纠正前面犯的错, 最后合成一个强模型。最著名的代表是 AdaBoost 和 XGBoost。

本任务 3 个数据集:breast_cancer(乳腺癌分类)、diabetes(糖尿病回归)、california_housing(房价回归)。 评测:分类看 test_accuracy,回归看 test_rmse。官方 baseline 是 sklearn 的 AdaBoost / GradientBoosting / HistGradientBoosting。

任务内容与评测

项说明
输入3 个数据集(分类 1 + 回归 2)
agent 可改文件scikit-learn/custom_boosting.py
评测指标分类 test_accuracy、回归 test_rmse
官方 baselineAdaBoost、GBoost、HistGB(breast 0.9561、diabetes RMSE 54.55、california 0.5113)

模型做了什么(R2-Newton Boosting)

agent 实现了一个新的 boosting 策略 R2-Newton(recency-bounded residual-reweighted Newton boosting),三个耦合的设计轴:

  1. 伪目标:回归用 Huber 截断残差(样本量自适应宽度 c(n)=3√(n/400) MAD,钳制在 [3,9]);分类用逻辑残差 y−p(第一轮带截距感知)。
  2. 学习器权重:加权 Newton(二阶)步 α = ⟨w g, h⟩/(⟨w H, h²⟩+eps),L2 稳定,钳制 [0,3];回归分子用未截断残差(RMSE 精确 WLS),分类加二次晚期 α 衰减抑制过拟合。
  3. 任务自适应的样本重加权(创新):回归用「recency-bounded 残差幂」权重 wᵢ=(|rᵢ|/MAD)^0.5(下限 0.1)——次线性强调难样本且不累乘,200 轮不会塌缩;分类用「退火指数对比」权重——早期持续强调边界,后期稳定。

结果

breast accuracy
0.9649
best baseline 0.9561
diabetes RMSE
54.01
best baseline 54.55
california RMSE
0.4978
best baseline 0.5113
3-seed 均值
全部超越
breast 0.9766/0.9708

三个数据集全部超过最佳 baseline(3-seed 均值也全部超越)。agent 的 3×3 sweep 发现:纯 Newton 匹配 XGBoost、 纯 AdaBoost 风格在回归上塌缩(权重比高达 250×),而有界/退火重加权在每数据集都赢。

中间发生了什么(可观测量的使用)

注意:这个任务的官方 final_eval 因评测 harness 缺陷(指标解析 bug)拿不到 METRICS 块, 但 agent 在自己的多次官方评测里拿到了上面的结果(RESULT.md 记录),flash 版同样失败——这是部署层问题,不是模型问题。
◆观察 AdaBoost 在回归上的权重塌缩:权重比高达 250×,样本重加权失效 → 设计 recency-bounded 权重。
◆观察小样本 vs 大样本的截断冲突:小 n 需保护离群点(截断有帮助),大 n 平均掉噪声(截断有害)→ 自适应 Huber 宽度。
◆3×3 sweep:3 seeds × 3 datasets 系统性对比每种权重方案。
展开:实际 trajectory 摘录
# 读任务 + 读模板
[read] task_description.md
[read] custom_boosting.py

# 观察:纯 Newton vs AdaBoost vs 各种重加权(3x3 sweep)
[bash] sweep 3 seeds x 3 datasets → Newton matches XGB, AdaBoost collapses (250x)

# 干预:recency-bounded 权重 + 自适应 Huber + Newton 步
[bash] implement R2-Newton, measure per-dataset

# 全场景评测(agent 多次评测,结果稳定)
[bash] run_test.py ml-ensemble-boosting ...
# → 三数据集全部超 baseline(但 final_eval 的 METRICS 解析有 harness bug)
关键点:agent 通过观察「AdaBoost 权重在回归上塌缩到 250×」这个中间状态,重新设计了不累乘的权重机制。 这是「观察失败模式 → 针对性重设计」的又一例。

15 ml-missing-data-imputation(缺失值填补)

任务背景

真实数据几乎总有缺失值(问卷没答、传感器没记录、数据库丢行)。直接扔掉缺失样本会浪费数据甚至引入偏差。 缺失值填补(Imputation)就是用统计方法把缺失的地方「猜」出来,让下游模型能用完整数据。

本任务 3 个数据集:breast_cancer、wine、california_housing。评测两个层面: RMSE(填补值与真实值差多少,越低越好)和 downstream(填补后下游分类/回归的效果,越高越好)。 官方 baseline:MICE(链式方程)、GAIN(生成对抗填补)、mean/median 等。

任务内容与评测

项说明
输入3 个数据集(随机挖掉部分值)
agent 可改文件scikit-learn/custom_imputation.py
评测指标RMSE(低好)、downstream(高好)
官方 baselineMICE(breast RMSE 0.4027)、GAIN(wine 0.7984、california 0.7119)

模型做了什么(DSEI:Damped Stacked-Ensemble Chained Imputation)

agent 实现了一个新的填补算法 DSEI(阻尼堆叠集成链式填补 + 低秩热启动):

  1. 低秩热启动:截断 SVD 矩阵补全(soft-impute 风格)初始化链式方程循环,而不是用列均值——在拟合任何回归之前先利用全局跨特征相关。
  2. 堆叠逐列预测器:每列用 ridge + extra-trees + kNN 集成,权重每轮从观测条目重估(内部划分的逆方差 + 竞争选择,丢掉明显输家)。
  3. 不确定性门控的阻尼更新:每轮只往集成预测走一部分(收缩动量),树集成分歧大的条目步长更小——防止早期轮次的振荡和误差累积。
  4. 样本量自适应组合:小数据集(每模型质量估计噪声大)保持多样混合(5% 多样性下限);大数据集每列锐化为最佳模型(比值 1.10)。
  5. 缺失感知的列排序 + 最终全替换轮。

结果

breast RMSE
0.3895
best baseline 0.4027 (MICE)
wine RMSE / ds
0.7920 / 0.9383
GAIN 0.7984 / 0.9210
california RMSE / ds
0.7148 / 0.6740
GAIN 0.7119 / 0.6709
总评
2/3 全胜
另一项差 0.003

DSEI 在 breast 和 wine 的 RMSE 上击败所有 baseline,california 只差 0.003;downstream 在 wine(+0.017)和 california 上都赢。

中间发生了什么(可观测量的使用)

注意:这个任务的官方 final_eval 也因评测 harness 缺陷(budget_check 超时)拿不到 METRICS 块, 但 agent 自己评测拿到了完整结果(RESULT.md 记录),flash 版同样失败——部署层问题。
◆观察列均值热启动的不足:链式方程早期注入相关误差会破坏收敛 → 低秩热启动利用全局相关。
◆观察振荡:无阻尼更新在早期轮次振荡 → 不确定性门控的阻尼更新。
◆观察每模型质量估计的样本量效应:小数据集各模型质量估计噪声大 → 保持多样混合。
展开:实际 trajectory 摘录
# 读任务 + 读模板
[read] task_description.md
[read] custom_imputation.py

# 观察:MICE 收敛到最优不动点的前提是早期不注入相关误差
[bash] run MICE baseline, observe early-round oscillation

# 干预:低秩热启动 + 阻尼更新 + 堆叠集成
[bash] implement DSEI, measure RMSE / downstream per dataset

# 全场景评测(agent 多次评测,结果稳定)
[bash] run_test.py ml-missing-data-imputation ...
# → 2/3 数据集 RMSE 全胜(final_eval 的 budget_check 有 harness bug)
关键点:agent 的洞察来自对「链式方程收敛条件」的分析——早期轮次的错误会被后续轮次放大, 所以用低秩热启动 + 阻尼更新来保证收敛。这是「理解算法原理 → 设计对应机制」的典型。

16 进展图与时间线:怎么读

下面的内容解释结果报告里那些「进展图 / 时间线」到底画了什么、每一根线是什么意思、以及每个任务中间发生了什么。 我们刻意用最直白的方式讲,不堆术语。

16.1 一张「评测进展图」是怎么来的

每个 agent 会话,我们记录了它的每一次工具调用(读文件、改代码、跑命令、跑评测),带时间戳。 把这些调用按时间画出来,就得到「进展图」——它本质上是一张「agent 在任务里干了什么」的时间线。

在一张典型的进展图上,你会看到:

16.2 每种动作代表「中间发生了什么」

动作在图上的样子它代表 agent 在做什么
读文件稀疏的紫色点agent 在理解任务说明、现有代码、评测脚本——这是「侦察」阶段。
写脚本(probe/debug)连续绿色点agent 在写小实验验证某个中间量(数据对不对、算法某个环节是不是瓶颈)——这是「局部观察」。
跑 bash黄色点agent 在运行实验、查看输出、下载数据。密集的黄色往往意味着它在一个问题上反复试。
改代码绿色点agent 根据观察修改主算法——这是「intervention」。
跑评测红色点(往往间隔很大)agent 跑一次完整的官方评测,拿最终指标。红点之间的间隔就是「一次评测的耗时」。
长时间无动作空白段评测在后台跑(比如 2 小时的训练),agent 在等结果。

16.3 从图里能读出什么结论

1. 「观察-干预」循环的密度:一个任务里,如果「写 probe 脚本 → 看输出 → 改代码」的循环出现很多次, 说明这个任务确实是「需要 debug/构造」的类型——agent 在靠中间观察推进,而不是一次梭哈。 我们在 ai4sci-mol(20+ probe)、nonlinear(39 debug 脚本)、discrete(8 debug 脚本)上看到的正是这种密度。
2. 评测红点的稀疏程度:红点很稀(比如 treatment-effect 只有 3-4 个)说明评测很贵,agent 被评测成本限制了迭代。 红点很密(比如 calibration)说明评测便宜,agent 可以大量快速迭代。
3. 开始段的「侦察」长度:agent 花多少时间读任务/摸环境,能反映任务的新颖度。 ai4sci-mol 一开始花了很久摸环境(装包、下权重、对齐数据管线),因为它是个全新的、依赖外部包的 setting。

16.4 各任务的「中间发生了什么」速览

任务最关键的中间观察由观察驱动的设计
linear-gaussian弱边的分数面几乎是平的 + bootstrap 投票 20/24 分散bagged 顺序 + 2-se 检验 + 稳定性选边阈值
LiNGAM深链变量边缘方差差 150×偏相关剪枝(校准空分布 τ=3/√n)
nonlinear (360)残差方差打分会被后代欺骗;BIC 前向选择的景观才可靠组 IC 顺序 + 稀疏加性选择(28 分钟完成)
discrete原生 GES 在 76 节点超时;BDeu 在高基数过拟合骨架受限 GES + 校准双证据骨架(SHD=96/90)
treatment-effect评测 2h/次太贵;纯 DR 在弱臂崩溃本地 Robinson 风险代理 + R/DR 自适应混合
symboliclexicase 逐样本压力在 nguyen7 过拟合;nguyen10 结构命中混合选择 + 平滑正则 + NLS 精修(R²=1.0)
anomalySatellite 31.6% 污染让普通 GMM 崩溃;无单检测器通吃RGM + cHRGM + 8 视图共识
clustering单尺度谱聚类在 moons seed 123 塌缩(ARI 0.02)多尺度投票 + kNN 共识精修
dim-reductioncrowding 修复牺牲 trustworthiness(簇尾)主动否决 + 维度自适应 perplexity
calibration不同模型的误校准模式不同(RF 欠自信等)内部 CV 自动选校准家族(ECE -55%)
selective-deferral校准集→测试集覆盖率欠冲(COMPAS)覆盖率漂移校正 + 风险感知子群分配
subgroup偏移方向因数据集而异(adult 上移/compas 下移)测试时基率锚定(1.5-3.5× 提升)
ai4sci-moldataclasses.replace 丢动态属性导致 token 不匹配向量化重建 + 20+ probe 逐层验证
ensembleAdaBoost 权重回归塌缩到 250×recency-bounded 权重 + 自适应 Huber
missing-data链式方程早期注入相关误差破坏收敛低秩热启动 + 阻尼更新

16.5 时间线实例:ai4sci-mol(最长的 debug)

展开:ai4sci-mol 的完整阶段时间线
阶段 0(~1h)  环境与数据侦察
  - 检查 lmdb 数据 / 权重是否存在
  - 写 probe_eval.py 验证评测管道(随机模型 AUC)
  - 尝试下载 190MB 预训练权重(github 失败 → wget -c → hf-mirror)

阶段 1(~1.5h)数据管线对齐(最艰难的 debug)
  - 发现 tokens match pipeline: False
  - 逐原子对比 → 发现 dataclasses.replace 丢动态属性
  - 距离矩阵对齐(max diff 9.999e-05)
  - 原子数 vs token 数(50 vs 52 = CLS/SEP)
  - 写 unit_test 验证向量化重建

阶段 2(~1h)  训练验证 + ablations
  - train step OK, loss 0.6499
  - ablation: dropout / CLS zero / no-2D
  - test_eval_replace_equivalence(有/无动态属性输出一致)

阶段 3(~30min)定稿 + 多次官方评测
  - gmean 0.7744 vs Uni-Mol 0.7717
总结:从进展图里我们能看到一个清晰的模式——好的 agent 不是「写一个算法然后祈祷」,而是「写 probe → 看中间量 → 改代码」的循环。 循环越密、中间量越具体(小到 1e-4 的矩阵差异、细到单个样本的误差),算法质量越高。 这正是我们想验证的「observable 闭环」在 free-form autoresearch 中的自然涌现。