返回列表

8th place solution

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

开始: 2025-06-26 结束: 2025-09-24 物理与天文 数据算法赛
第 8 名解决方案
作者: siwooyong (MASTER)
排名: 第 8 名
发布时间: 2025-09-27

第 8 名解决方案

基于物理的波长预测与基于机器学习的 Sigma 预测

我要感谢 Kaggle 和伦敦大学学院举办这次比赛。我学到了很多,这真是一次激动人心的经历。


总结

  1. 预处理:降噪
  2. 第一阶段:凌日时间预测与坏样本过滤
  3. 第二阶段:基于物理的凌日建模与 2D 全局拟合
  4. 后处理:基于机器学习的 Sigma 预测与简单优化

预处理:降噪

  • 应用了所有标准预处理函数,除了 mask_hot_dead 函数。
  • 对于时间分箱 (time binning),airs_ch0 通道使用 30,fgs1 通道使用 30 × 12。
  • 空间维度被裁剪到 8 ~ 24 的范围。
  • remove_outlier 函数使用局部均值修改数据中的异常值。
  • remove_outlier 函数的效果可以在下图中确认。
def remove_outlier(data, window = 100, threshold = 5.0):
    df = pd.DataFrame(data)
    
    mean = df.rolling(window = window, center = True, min_periods = 1).mean()
    std = df.rolling(window = window, center = True, min_periods = 1).std()
    
    mask = (df - mean).abs() > (threshold * std)
    
    df[mask] = mean[mask]
    data = df.to_numpy()
    return data
预处理效果示意图

第一阶段:凌日时间预测与坏样本过滤

  • 输入是通过平均所有通道然后归一化获得的。
  • 凌日 (Transit) 和系统 (System) 使用简单的多项式建模,以预测 T1, T2, T3, T4。
  • 此外,预测成功与否以防止坏样本产生负分。
  • 如果 success == False,wl 和 sigma 设置为训练数据集的均值和标准差。
  • success = False 的标准:
    1. 拟合误差 > 1e-3
    2. T1 < 0.01 或 T4 > 0.99
  • 第一阶段的拟合结果可视化如下。
第一阶段拟合结果

第二阶段:基于物理的凌日建模与 2D 全局拟合

  • 实现了自定义的非线性临边昏暗 (limb darkening) 流程 (c1, c2, c3, c4),灵感来自 batman 库。
  • 为了避免不现实的情况(即 c1 + c2 + c3 + c4 > 1),每个系数被限制在 0.25 以内。
  • 使用 least_squares 对所有通道进行全局拟合,参数包括:rp, c1, c2, c3, c4, P, sma, i, t0。
  • 对 c1–c4 应用 tanh(范围 -1 到 1)以提高收敛稳定性并更容易设置最大约束。
  • 构建 jac_sparsity 以预定义参数相关性并加速收敛。
  • 采用了上一届比赛第一名的方法:system = 1 + f(time) × g(wavelength)。
  • 为了减轻临边昏暗效应和系统效应之间的简并性,使用了 2 步拟合:
    1. 步骤 1:f 和 g 建模为 3 阶多项式。
    2. 步骤 2:f 和 g 建模为 4 阶多项式。
  • 这使得临边昏暗系数能够首先收敛,减少简并性带来的误差。
  • 为了更快的计算,应用了波长分箱 (wavelength binning) 为 4。
  • 由于 airs_ch0 中超过 200 的通道噪声严重,使用了 50 的窗口大小。
  • 第二阶段拟合的目标可视化如下。
with Pool(processes = os.cpu_count()) as pool:
    res = least_squares(
        fun = fun,
        x0 = x0,
        bounds = bounds,
        method = 'trf',
        jac_sparsity = jac_sparsity,
        args = (time, star_info, param_info, targets),
        workers = pool.map,
        verbose = 2 if plot else 0,
    )
第二阶段拟合图像 1 第二阶段拟合结果

后处理:基于机器学习的 Sigma 预测与简单优化

  • inputs = 从第一阶段和第二阶段获得的训练数据参数。
  • targets = 每个样本的最佳 sigma,通过 np.linspace(5e-5, 2e-3, 500) 计算。
  • 应用了 4 折集成的 GradientBoostingRegressor 进行推理。
  • 对于 fgs1 通道,结果简单地从 airs_ch0 通道缩放 ×2。
  • 额外的优化 -> 波长缩放,gaussian_filter1d,和 PCA。
inputs = np.concatenate([
    T,
    T[:, 3:4] - T[:, 0:1],
    T[:, 2:3] - T[:, 1:2],

    rp[:, :-1].mean(1, keepdims = True),
    c1[:, :-1].mean(1, keepdims = True),
    c2[:, :-1].mean(1, keepdims = True),
    c3[:, :-1].mean(1, keepdims = True),
    c4[:, :-1].mean(1, keepdims = True),

    rp[:, :-1].std(1, keepdims = True),
    c1[:, :-1].std(1, keepdims = True),
    c2[:, :-1].std(1, keepdims = True),
    c3[:, :-1].std(1, keepdims = True),
    c4[:, :-1].std(1, keepdims = True),

    cost,
    nfev,

    star_info.values,
], axis = 1)

代码

同比赛其他方案