返回列表

5th place solution

670. NeurIPS - Ariel Data Challenge 2025 | ariel-data-challenge-2025

开始: 2025-06-26 结束: 2025-09-24 物理与天文 数据算法赛
第五名解决方案 - Ariel 2025
标题: 第五名解决方案
作者: Alehandreus
发布时间: 2025-09-28
竞赛: Ariel Data Challenge 2025

第五名解决方案

这次比赛是一个很好的机会,让我暂时脱离深度学习,做一些建模工作。非常感谢 Kaggle, @gordonyip 以及所有其他组织者,期待 2026 年版!

我的解决方案基础是一个物理模型,其参数经过拟合以匹配噪声数据。接下来,我应用一些后处理来优化结果,最重要的是梯度提升(Gradient Boosting)。


流程 (Pipeline)

  1. 校准数据,去除异常值,进行 5 倍时间分箱 (T=1125) 和 6 倍光谱分箱 (W=47);
  2. 使用正则化高斯 - 牛顿算法拟合物理模型;
  3. 使用 PCA 和 Boosting 优化输出。

物理模型

该模型类似于 Ariel 2024 中提出的模型。然而,现在的凌日深度要复杂得多。

物理模型示意图

1. 恒星光谱 (Star Spectrum) 计算方式为 sensor_data.mean(axis=0) / (transit_depth * poly_drift).mean(axis=0)。没有专门针对恒星光谱优化的参数。

2. 凌日深度 (Transit Depth) 是模型的主要部分。它接收一堆参数,并输出每个时刻每个波长剩余的光量。基本上,这与 @junkoda笔记本 中描述的模型相同:

transit depth(t, w) = 1 - ∫ F(x)dx (积分区域为 D_tw)

这里 D 是每个时刻 t 每个波长 w 下恒星和行星圆盘的交集。F 是根据临边昏暗定律 (limb darkening law) 计算的恒星强度。我使用了非线性定律,包含六个系数,覆盖 x^0.5 到 x^3。数值积分也取自 @junkoda 的笔记本(毕竟这是必要的 :D)。以下是完整参数列表:

  • Rp mean — 标量;
  • Rp variation — 15 个值线性插值到 W 值;
  • 撞击参数 b — [0, 1] 之间的标量。实际上可以大于 1,但并没有帮助;
  • limb coeffs — 非线性临边昏暗模型的六个系数;
  • ingress, egress — 两个标量,表示凌日窗口的开始和结束。

我还尝试添加 轨道半径 (orbit radius) 以考虑轨迹曲率。在使用 batman 手动生成的样本进行测试时效果更好,但在训练数据上表现不佳。

值得注意的是,凌日凹陷是平滑的,并且长度随光谱变化。一个具有最大 Rp 范围的行星很好地说明了这一点:

凌日深度拟合示例

3. 多项式漂移 (Polynomial Drift) 是 1 + f(t, w),其中 f 是时间维度为 4 度、波长维度为 2 度的双变量多项式,共产生 15 个参数。


拟合与实现

优化 (Optimization)。上述所有参数的模型输出都是可微的。我假设噪声为高斯分布,并使用根据噪声偏差加权的波长的 MSE 损失。我最终使用 Levenberg-Marquardt 方法进行拟合(应该感谢 @jeroencottaar,他的 GWI 解决方案让我做了一些关于优化的挖掘)。

优化运行 220 次 LM 迭代,主要在一个阶段同时拟合所有参数。唯一的例外是多项式漂移在第 70 次迭代之前被锁定,Rp 变化在第 180 次迭代之前被锁定。

优化过程动画

Sigma 预测 在光谱上是恒定的,计算很简单:mu.std() * 1.6

切割凌日 (Cut transits)。由于 ingress / egress 是自动拟合的,我不必为单边行星添加任何特殊处理。

性能 (Performance)。一个行星的拟合时间取决于凌日宽度,通常在 P100 (FP64) 上需要 20-25 秒。所有逻辑均使用 PyTorch 和 autograd 实现。凌日深度积分用 40 个环估算。

AIRS / FGS 通道。仅将模型应用于 AIRS(并将 FGS mu 设置为平均 AIRS mu)在公共排行榜上的得分约为 0.542。同时也拟合 FGS 将得分提高到了 0.546。


优化输出

线性趋势与不稳定性。不知何故,我的方法拟合 Rp 时带有额外的线性趋势,且在光谱右边缘值不稳定。我还没有找到比简单地作为后处理步骤去除该趋势更好的方法,并设置 Rp[-50:] = Rp[-50]。以下是第一个行星的原始输出:

原始输出示例

高撞击参数的行星。对于 b > 0.75 的行星,我的模型拟合的 mu 值比真实值大约 4-6%。这是另一个我未能解开的谜团。我为这些行星添加了特殊处理:

if model.get_b() > 0.75:
    mu = mu / 1.05
    sigma = sigma * 7.0

应用 PCA 对预测的 Rp 变化进行 PCA 处理,使公共排行榜得分提高了 0.007。我使用了 3 个分量。

梯度提升 (Gradient Boosting) 对我特别有效,在最后一周将我的得分提高了 0.028。我用它来优化 AIRS 和 FGS 的 mu 和 sigma:

  • 输入特征是 star_info.csv 数据和所有拟合参数;
  • 输出是常数偏移(例如,mu_airs 变为 mu_airs + dmu_airs,其中 dmu_airs 是标量提升输出)。

得分

第一行显示的是已经去除趋势和不稳定值后的得分。

提交版本 公共排行榜 (Public LB) 私有排行榜 (Private LB)
仅拟合 AIRS 模型 0.542 0.550
同时也拟合 FGS 0.546 0.554
添加 PCA 0.553 0.557
添加 AIRS mu & sigma 提升 0.577 0.586
添加 FGS mu & sigma 提升 0.581 0.589

代码

同比赛其他方案