返回列表

9th Solution

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

开始: 2025-06-26 结束: 2025-09-24 物理与天文 数据算法赛
第 9 名解决方案 - ARIEL Data Challenge 2025

第 9 名解决方案

副标题: 预处理、Batman、Pylightcurve-torch 和 GPytorch、高斯回归。

作者: CPMP (Grandmaster), Dieter (Grandmaster)

比赛: ARIEL Data Challenge 2025

排名: 第 9 名

发布日期: 2025-09-26

感谢 Kaggle 及所有参与举办这场有趣比赛的人。有很多东西值得学习,这就是我们参赛的原因。

摘要 (TLDR)

我们的解决方案是混合使用 transit 光变曲线拟合,要么使用 batman + scipy-optimize,要么使用 pylightcurve-torch + gpytorch。然后我们训练了一个线性神经网络(NN)来校准预测并估计 sigma 值。

我们直到比赛结束前一周才发现 Pylightcurve-torch 和 GPytorch。随后我们冲刺 replicating 并改进了 batman 管道。

交叉验证 (Cross validation)

交叉验证很简单。我们 simply 将恒星分成 4 折。我们评估了没有交叉验证的曲线拟合步骤,因为没有训练,但对于神经网络后处理,我们进行了适当的交叉验证评估。总体而言,我们的交叉验证与 LB (Leaderboard) 相关性非常好。

数据预处理 (Data preprocessing)

我们使用 @ilu000 的预处理作为基础,该预处理已在此分享:https://www.kaggle.com/code/ilu000/ariel25-quick-data-prep-improved

我们添加了一个用于检测宇宙射线的微调,这也分享在 @jeroencottaar 的 notebook 中:https://www.kaggle.com/code/jeroencottaar/demonstrate-apparent-label-issue

我们做了以下额外的更改。当我们实施它们时,它们产生了超过 0.005 的分数改进。

  • 反向偏移量 (Inverted offset)。 比赛开始时提供的公式是用于编码数据的公式。鉴于我们必须解码,我们必须反转公式中的两个操作。宿主在比赛期间只修复了一个反转。
  • 暗帧处理。 暗帧必须乘以自传感器重置以来的持续时间。因此我们以这种方式更新了代码:
# Step 4: dark current subtraction
if sensor == "FGS1":
    dt = torch.ones(len(signal), device="cuda:0") * 0.1
    dt[1::2] += 0.3
elif sensor == "AIRS-CH0":
    dt = torch.tensor(dt_airs).to("cuda:0")
    dt[1::2] += 0.2
  • 抖动去除 (Jitter removal)。 我们通过计算空间维度上的中心来居中信号,然后使用 scipy 2d interpolate 将中心移动到帧的中心。这样做我们需要裁剪最外层的像素。

这是一个在空间轴上校正 AIRS 中心的例子。橙色是校正后的结果。

AIRS 中心校正示例
  • 宇宙射线处理。 某些帧有很大的中心偏差。这是因为宇宙射线。我们 simply 丢弃这些帧并用前一个帧替换它们。这里是宇宙射线对 FGS1 影响的两个例子。
宇宙射线对 FGS1 的影响
  • 色散变化。 我们没有修复由于抖动引起的色散变化。它仍然可能很显著。这里是同一颗行星,我们在其中一个 FGS1 空间轴上绘制了信号的标准差归一化值。中间的凸起意味着更多的信号将从一个窄正方形中被裁剪。
FGS1 空间轴信号方差
  • 光斑形状。 光线在 FGS1 传感器上并没有呈现为完美的椭圆。这里是所有行星 FGS1 信号的对数缩放平均值,在居中之后:
FGS1 信号平均值

我们屏蔽了该平均值的较暗部分,而不是使用中心的正方形裁剪。

主要方法 (Main approach)

我们采用了一种迭代曲线拟合策略,从噪声瞬态光变曲线数据中提取行星与恒星半径比 (Rp/Rs)。该过程包括在不同数据表示上 progressively refining 拟合:

  1. 相位检测 (Phase detection) – 识别信号的轨道相位以对齐凌星特征。我们使用了公共 notebook 中提到的波长上最大的平均梯度。
  2. 基线建模 (Baseline modeling) – 对光变曲线的凌星外“臂”应用 2 度多项式拟合,以建模和去除基线趋势。
  3. 全局凌星拟合 (Global transit fitting) – 使用 batman 凌星模型拟合归一化光变曲线,产生 Rp 的初始估计。
  4. FGS refinement – 在 FGS 数据上重复拟合。
  5. 波长分箱 (Wavelength binning) – 将相同的拟合程序应用于 18 个波长桶,捕获波长依赖性变化。
  6. 带 GP 的波长分箱 (Wavelength binning with GP) – 对于桶装数据,使用 2D 多项式加高斯过程 (GP) 模型来联合捕获系统趋势和相关噪声, refining Rp 估计。

后处理 (Postprocessing)

  1. 合并预测。 我们将不同曲线拟合步骤的结果合并为 18 个预测值和 283 个 sigma 值;然后将这些值输入线性神经网络,该网络对不同 sigma 估计进行加权,并将 18 个预测值扩展回 283 个值。
  2. 训练简单的神经网络以校准预测和 sigma。 我们使用神经网络是因为我们使用了 GLLoss 而不是用于线性回归的 usual MSE。
import torch
import torch.nn as nn
import torch.nn.functional as F

class Net(nn.Module):
    def __init__(self, ):
        super().__init__()
        self.pred_fc = nn.Linear(18, 283, bias=True)
        self.sigma_fc = nn.Linear(5, 1, bias=True)
        
    def forward(self, pred, sigma, s_std, var_l, s_std2, s_std3):
        x = torch.log(pred).float()
        x = self.pred_fc(x).squeeze(-1)

        y = torch.stack([sigma, s_std, var_l, s_std2, s_std3], 2).float()
        y = torch.log(y)
        y = self.sigma_fc(y).squeeze(-1)
        return x, y
同比赛其他方案