这份文档回答三个问题:每个 MLS-Bench 任务到底在做什么(背景、输入、输出、怎么打分)、 deepseek-v4-pro 模型在任务中实际做了什么(它写的算法、它改了哪些东西)、 以及 中间到底发生了什么(模型观察了什么中间量、怎么调试、怎么迭代)。
所有运行都是 dsh 极简模式(只保留 Bash + 文件编辑器两个工具,没有网页搜索、没有计划模式、没有子代理)+ deepseek-v4-pro 模型,不限时,跑到 agent 自己觉得完成(写 RESULT.md)为止。 运行在两台机器:ophis-gpu(8×H200)和 360-1(8×H100)。
下面这些指标会反复出现。先记住它们的含义,后面的任务就都能读懂了。
| 指标 | 全称 | 含义(用大白话) | 方向 |
|---|---|---|---|
| SHD | Structural Hamming Distance | 你画出来的因果图,和真实因果图相比,「边」对不上(多了/少了/方向反了)的总数。0 = 完美还原。 | 越低越好 |
| F1 | F1 score | 「找对的边 / 所有找出来的边」和「找对的边 / 所有真实存在的边」的调和平均。1 = 完美,0 = 全错。 | 越高越好 |
| Precision / Recall | 精确率 / 召回率 | Precision:你声称有的边里有多少真的存在;Recall:真实存在的边里你找到了多少。 | 越高越好 |
| CPDAG | Completed Partially Directed Acyclic Graph | 因果图的一种「等价类」表示:有些边方向确定(→),有些边方向未定(—)。线性高斯数据下只能识别到这个程度。 | — |
| DAG | Directed Acyclic Graph | 有向无环图,每条边都有明确方向。 | — |
| R² | Coefficient of Determination | 回归拟合优度:模型解释了数据中多大比例的方差。1 = 完美拟合,0 = 不如直接用均值。 | 越高越好 |
| RMSE | Root Mean Squared Error | 预测值与真实值之差的均方根。越小越好。 | 越低越好 |
| AUROC | Area Under ROC Curve | 二分类器把「正类排前面」的能力。0.5 = 瞎猜,1.0 = 完美。 | 越高越好 |
| ECE | Expected Calibration Error | 校准误差:模型说「我有 90% 把握」时,实际有多少次真的对了。0 = 完美校准。 | 越低越好 |
| ARI | Adjusted Rand Index | 聚类结果与真实类别的匹配度(考虑随机因素修正)。1 = 完全一致,0 = 随机。 | 越高越好 |
| NMI | Normalized Mutual Information | 聚类与真实类别的互信息归一化。1 = 完全一致。 | 越高越好 |
| PEHE | Precision in Estimation of Heterogeneous Effects | 估计的个体处理效应与真实个体处理效应的均方根误差。0 = 完美估计每个个体的效应。 | 越低越好 |
| ATE error | Average Treatment Effect error | 估计的平均处理效应与真实平均处理效应之差。 | 越低越好 |
| rocauc | ROC-AUC | 分子性质预测的评估指标(每个数据集一个),含义同 AUROC。 | 越高越好 |
| elapsed_* | elapsed | 该场景单次评测消耗的秒数。这个数字本身不参与排名,但用来判断算法是否太慢(超时会判无效)。 | — |
custom_*.py),不能碰评测 harness。评测脚本会跑 agent 的实现,打印训练/测试指标,最后输出一个 === METRICS === JSON 块。每个任务都有若干官方 baseline(比如 PC、BOSE、t-SNE 等),agent 的目标是超过它们。
因果发现(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(方向正确性) |
| 官方 baseline | PC(SHD 344)、GRaSP(109)、BOSS(24)——注意这是跨 5 场景的总 SHD |
baseline 数字来自官方 leaderboard:PC 344、GRaSP 109、BOSS 24(5 场景总和)。这个任务被官方评为「很能区分 agent 能力」的中等难度任务。
agent 写了一个全新的算法 EVS(Equal-variance Cholesky Score search,等方差 Cholesky 分数搜索),核心思路:
总 SHD = 1,把官方最佳 baseline(BOSS 24)从 24 降到 1,也比之前所有 agent 解(最好 7)好得多。 唯一的残差是一条弱边(2→19,权重 0.35,噪声 2.5,样本 400)方向判反——这是统计极限,数据本身几乎不携带方向信息。
pooled likelihood 分数面几乎是平的(两种方向的分数差 < 统计噪声),这是"为什么 greedy 会翻车"的直接观察。# 先读任务说明和 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
上一个任务(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 越好,其余越高越好) |
| 官方 baseline | DirectLiNGAM(F1 0.99/0.99/0.99)、ICALiNGAM(0.995/0.994/0.82)、NOTEARS(更弱) |
agent 实现的是 Pruned DirectLiNGAM——官方 DirectLiNGAM 的顺序搜索 + 一个统计剪枝的回归阶段:
三个场景全部 SHD = 0、F1 = 1.0(完美恢复真实 DAG),把官方 DirectLiNGAM 的残余错误(每场景 2–6 条伪边)全部消除。 运行时也快(9s / 22s / 87s)。
# 读任务、读现有实现 [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
前两个任务都是「线性」机制。本任务把机制换成非线性:每个变量的值 = 父变量的非线性函数 + 加性噪声。 这是更接近真实世界的设定(比如基因调控、气候变量之间通常不是简单的线性关系)。
非线性带来了新的可识别性:加性噪声模型(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 |
| 官方 baseline | CAM(F1 0.853 / 0.723 / 0.542) |
360 上跑的 agent 实现了 ANM-GAM,一个完整的非线性 ANM 因果发现流水线:
三个场景的 F1 都远超官方最佳 baseline(CAM)。剩余的错误是 SNR < 0.1 的极弱边,接近检测极限。 这是 360 机器的结果,**全程只用了 28 分钟**。
/tmp/dev 里写了 20+ 个原型/调试脚本。
# 先摸清环境(没有 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 分钟完成)
前面几个因果任务处理的是连续变量。本任务处理离散数据:每个变量的取值是有限个离散类别 (比如「是/否」、五个风险等级),变量之间的关系用贝叶斯网络(有向无环图 + 每个节点的条件概率表)建模。 这类网络在医学(如 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 求和 |
| 官方 baseline | PC(122)、GES(101)、GRaSP(112)、BOSS(98)、HC(212)——括号内是 5 网络总 SHD |
360 上跑的 agent 实现了一个混合算法 C-DAG(Consensus-skeleton-constrained Greedy Equivalence Search):
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 各自写的算法,都超过了官方最佳。
/tmp 写了 8+ 个 debug 脚本,迭代历史清晰可见:贪心 BDeu → 受限 GES → 校准双证据骨架。
# 读任务说明 + 现有实现 + 评测 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)
这是因果推断里的「黄金问题」:估计处理效应(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(平均效应误差) |
| 官方 baseline | S-Learner、T-Learner、X-Learner、R-Learner、因果森林(causal_forest)等 |
| 评测代价 | 单次评测约 1.5–2 小时(10 重复 × 5 折交叉验证,3 数据集合计 ~7000s)——全任务里最贵的评测 |
agent 实现了一个复杂的 CATE 估计器 VARDR-X(Variance-Adaptive Robust Doubly-Robust):
结果中等偏上:Jobs ATE error 击败所有 baseline,其余 5 项指标都是第 2 名(略逊于最佳 baseline)。 这是 13 个任务里 agent 提升最小的一个——原因是评测太贵(单次 2 小时),agent 只做了 3–4 次官方评测, 迭代空间被压缩。它用「本地留出 Robinson 风险代理」来弥补,把 IHDP PEHE 从 0.842 降到 0.800。
# 读任务 + 读 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
符号回归(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 等) |
agent 在 gplearn 里实现了一个混合 GP 搜索策略:
三任务几何平均 0.9981 > 最佳 baseline 0.9952,并且 nguyen10 精确恢复出真实公式。 360 上的 agent 也达到了 R² = 0.9988/1.0/0.9995,两个独立运行都很好。
# 读任务 + 读 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 精确恢复公式)
异常检测(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,任务分 = 几何平均 |
| 官方 baseline | iForest(0.9446/0.5571…)、OCSVM、ECOD、COPOD、LOF——各数据集强弱不同 |
agent 实现了一个全新的异常打分器 CRC(Contamination-robust Consensus scoring,抗污染共识打分):
任务分 0.7982(seed 42)。最大亮点是 satellite:31.6% 污染的极端场景下,AUROC 0.7764 远超所有 baseline (ECOD 0.585、COPOD 0.634、iForest 0.7135)。这是「稳健高斯 + 抗污染共识」直接针对高污染场景设计的成果。 其余数据集与最佳 baseline 持平(±0.02)。
# 读任务 + 读模板(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)
聚类(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,任务分 = 几何平均 |
| 官方 baseline | K-Means(ARI 0.935/0.481/0.534) |
agent 实现了一个三阶段算法 MUSES(Multi-Scale Spectral Ensemble with Consensus Refinement,多尺度谱聚类集成 + 共识精修):
K-Means 只作为安全网和自动估计簇数。
最大提升在 moons(ARI 0.481 → 1.0,完美)和 digits(0.534 → 0.750)。blobs 与 baseline 持平。 关键洞察:K-Means 对非凸(moons)和高维流形(digits)都会失败,而 kNN 图谱聚类能抓住两者。
# 读任务 + 读 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%)
降维(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 |
| 官方 baseline | t-SNE(MNIST knn 0.868 / trust 0.963 / cont 0.966) |
agent 实现了一个新的非线性嵌入算法 APNE:
agent 还试过「持久非归一化排斥地板 + 约束弹簧」(crowding 修复),但实验显示它会牺牲 trustworthiness(产生簇尾),所以被移除——这是「试了 → 观察到副作用 → 否决」的典型路径。
结果接近 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 分钟。
# 读任务 + 读 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 持平
概率校准(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 |
| 官方 baseline | temperature、Platt、isotonic(ECE 0.0122/0.0091/0.0161/0.0188 等) |
agent 实现了一个自适应的两层校准估计器 ASMC,完全从留出校准集学习:
ECE 在 rf-mnist(-55%)和 fashion-mnist(-32%)大幅优于最佳 baseline;madelon 比 temperature 降 43%; 只在 NLL 上付出 1–6% 的微小代价。小样本 breast_cancer 安全退回 temperature。
# 读任务 + 读模板 [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%
选择性预测(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 |
| 官方 baseline | learned_deferral(≈0.299 归一化分)等 |
归一化任务分 ≈0.465,比最佳 baseline(learned_deferral ≈0.299)高约 55%。 三个数据集的 risk@80 都在合理范围,且最差子群风险与总体风险接近(公平性较好)。
# 读任务 + 读模板 [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)
这个任务是「概率校准」的进阶版:不仅要让整体置信度准确,还要在每个子群里都准确(公平性), 并且要应对分布偏移(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) |
每个数据集的每个指标都提升了 1.5–3.5 倍。剩下的 worst_group_ece 已经达到分箱估计器的小样本噪声地板。 这是 13 个任务里相对 baseline 提升最显著的之一(只在 31 分钟就完成)。
# 读任务 + 读模板 [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× 提升
这是 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,任务分 = 几何平均 |
| 官方 baseline | Uni-Mol(0.713/0.847/0.761)、D-MPNN、GIN |
| 评测代价 | 每个数据集训练 40 epochs,单次全评测 ~1–2 小时 |
agent 用预训练 Uni-Mol 3D Transformer + 几何门控 2D 消息传递网络组了一个双视图模型:
mol_pre_all_h_220816.pt 加载权重。
Token id 和 CLS/SEP 扩展距离矩阵从声明的 batch 字段向量化重建(因为评测 harness 的 dataclasses.replace 会丢动态属性),
并用参考管线的零行约定匹配预训练分布。Readout = CLS + masked-mean + pair-mean。几何平均 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 几何信息在不破坏预训练微调轨迹的前提下融入。
tokens match pipeline: False → 逐原子对比,发现 dataclasses.replace 丢动态属性,改用向量化重建。max dist diff (valid pairs): 9.999e-05(对齐验证,精确到 1e-4)。n atoms lmdb: 50 n tokens: 52(+2 是 CLS/SEP)。E 18 N 18 m (18,192) pad[src] (18,2)、output shape: torch.Size([3,3])。train step OK, loss: 0.6499、参数量 48,878,342(预算内)。# 阶段 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
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 |
| 官方 baseline | AdaBoost、GBoost、HistGB(breast 0.9561、diabetes RMSE 54.55、california 0.5113) |
agent 实现了一个新的 boosting 策略 R2-Newton(recency-bounded residual-reweighted Newton boosting),三个耦合的设计轴:
三个数据集全部超过最佳 baseline(3-seed 均值也全部超越)。agent 的 3×3 sweep 发现:纯 Newton 匹配 XGBoost、 纯 AdaBoost 风格在回归上塌缩(权重比高达 250×),而有界/退火重加权在每数据集都赢。
# 读任务 + 读模板 [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)
真实数据几乎总有缺失值(问卷没答、传感器没记录、数据库丢行)。直接扔掉缺失样本会浪费数据甚至引入偏差。 缺失值填补(Imputation)就是用统计方法把缺失的地方「猜」出来,让下游模型能用完整数据。
本任务 3 个数据集:breast_cancer、wine、california_housing。评测两个层面: RMSE(填补值与真实值差多少,越低越好)和 downstream(填补后下游分类/回归的效果,越高越好)。 官方 baseline:MICE(链式方程)、GAIN(生成对抗填补)、mean/median 等。
| 项 | 说明 |
|---|---|
| 输入 | 3 个数据集(随机挖掉部分值) |
| agent 可改文件 | scikit-learn/custom_imputation.py |
| 评测指标 | RMSE(低好)、downstream(高好) |
| 官方 baseline | MICE(breast RMSE 0.4027)、GAIN(wine 0.7984、california 0.7119) |
agent 实现了一个新的填补算法 DSEI(阻尼堆叠集成链式填补 + 低秩热启动):
DSEI 在 breast 和 wine 的 RMSE 上击败所有 baseline,california 只差 0.003;downstream 在 wine(+0.017)和 california 上都赢。
# 读任务 + 读模板 [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 会话,我们记录了它的每一次工具调用(读文件、改代码、跑命令、跑评测),带时间戳。 把这些调用按时间画出来,就得到「进展图」——它本质上是一张「agent 在任务里干了什么」的时间线。
在一张典型的进展图上,你会看到:
| 动作 | 在图上的样子 | 它代表 agent 在做什么 |
|---|---|---|
| 读文件 | 稀疏的紫色点 | agent 在理解任务说明、现有代码、评测脚本——这是「侦察」阶段。 |
| 写脚本(probe/debug) | 连续绿色点 | agent 在写小实验验证某个中间量(数据对不对、算法某个环节是不是瓶颈)——这是「局部观察」。 |
| 跑 bash | 黄色点 | agent 在运行实验、查看输出、下载数据。密集的黄色往往意味着它在一个问题上反复试。 |
| 改代码 | 绿色点 | agent 根据观察修改主算法——这是「intervention」。 |
| 跑评测 | 红色点(往往间隔很大) | agent 跑一次完整的官方评测,拿最终指标。红点之间的间隔就是「一次评测的耗时」。 |
| 长时间无动作 | 空白段 | 评测在后台跑(比如 2 小时的训练),agent 在等结果。 |
| 任务 | 最关键的中间观察 | 由观察驱动的设计 |
|---|---|---|
| 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 自适应混合 |
| symbolic | lexicase 逐样本压力在 nguyen7 过拟合;nguyen10 结构命中 | 混合选择 + 平滑正则 + NLS 精修(R²=1.0) |
| anomaly | Satellite 31.6% 污染让普通 GMM 崩溃;无单检测器通吃 | RGM + cHRGM + 8 视图共识 |
| clustering | 单尺度谱聚类在 moons seed 123 塌缩(ARI 0.02) | 多尺度投票 + kNN 共识精修 |
| dim-reduction | crowding 修复牺牲 trustworthiness(簇尾) | 主动否决 + 维度自适应 perplexity |
| calibration | 不同模型的误校准模式不同(RF 欠自信等) | 内部 CV 自动选校准家族(ECE -55%) |
| selective-deferral | 校准集→测试集覆盖率欠冲(COMPAS) | 覆盖率漂移校正 + 风险感知子群分配 |
| subgroup | 偏移方向因数据集而异(adult 上移/compas 下移) | 测试时基率锚定(1.5-3.5× 提升) |
| ai4sci-mol | dataclasses.replace 丢动态属性导致 token 不匹配 | 向量化重建 + 20+ probe 逐层验证 |
| ensemble | AdaBoost 权重回归塌缩到 250× | recency-bounded 权重 + 自适应 Huber |
| missing-data | 链式方程早期注入相关误差破坏收敛 | 低秩热启动 + 阻尼更新 |
阶段 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