返回列表

10th Place Solution

626. NeurIPS - Ariel Data Challenge 2024 | ariel-data-challenge-2024

开始: 2024-08-01 结束: 2024-10-31 物理与天文 数据算法赛
第 10 名解决方案 - Ariel Data Challenge 2024

第 10 名解决方案

作者: Georgii Aparin (egorgij21)

发布日期: 2024-11-03

竞赛排名: 第 10 名

竞赛: Ariel Data Challenge 2024

感谢本次比赛的参与者和组织者。比赛非常有趣且具有教育意义。我希望一年后能在 Kaggle 上看到 Ariel 比赛。

方法

我们使用了多项式近似方法。非常感谢 Sergey 的分享。我们方法的主要区别在于使用了整个信号,没有 cut 掉进入/退出凌日的时刻。您可以在这个 notebook 链接 查看所有代码。

凌日区域检测

凌日相位检测算法分析信号的时间序列,计算滑动窗口中的导数,以识别光强度的突然变化,这是行星进入和退出凌日状态的特征。

凌日检测导数分析

基于导数的极值,确定凌日第一和第二相位的中点。为了 clarify 第一相位的开始,信号被分为两个线性部分并进行误差最小化,从而可以准确确定凌日的开始。总之,该算法返回进入/退出索引以及进入/退出凌日的过渡持续时间。

凌日相位确定

凌日恢复函数

由于不知道可以模拟凌日的函数的一般格式,我们选择了这个函数,因为它平滑,可以很好地近似 piecewise 真实函数。后来使用 UNIFORM 格式并没有导致分数增加,我们决定保留平滑版本。

恢复函数

凌日校正示例:

凌日校正示例

预测收集流程

我们的主要流程通过执行波长 binning 聚合并选择随机样本索引来计算目标。

步骤:

  1. 计算参数: 我们计算参数 p1, p2, 和 t,分别代表凌日开始、凌日结束和过渡到凌日的持续时间。
  2. 在归一化信号上计算 d_st 和多项式: 我们计算 d_st,它代表目标的平均预测(在我们的代码中表示为 "d")。在这一步,我们还优化第一步中获得的其他参数。
  3. 迭代波长索引: 使用大小为 2 * k_binn_wl 且步长为 k_binn_wl // 2 的移动窗口,我们迭代波长索引。
  4. 在子样本上优化多项式: 在每个窗口内,我们在当前窗口中随机选择的波长子样本上优化 15 个多项式。对于每个子样本,我们选择 k_binn_wl 个波长。
  5. 分解子样本: 每个子样本进一步分为更小的波长索引组,我们仅在其平均信号上优化目标。
  6. 计算噪声波长的预测: 最后,我们使用相同的算法计算噪声波长的预测,但没有前 k_binn_wl 次迭代。
p1, p2, t = phase_detector(normalized_planet[:, :-1].mean(axis=1))

t_st, d_st, p1_st, p2_st, poly, deg = calibrate_train_poly(normalized_planet[:, :-1].mean(axis=1), p1, p2, t, x)

for k in range(100, 283, k_binn_wl // 2):
    for j in range(15):
        subsample = np.sort(np.random.choice(np.arange(max(k - k_binn_wl, 0), min(k + k_binn_wl, 283)), k_binn_wl, replace=False))

        signal = normalized_planet[:, subsample].mean(axis=1)

        t_st_j, d_st_j, p1_j, p2_j, poly_j, _ = calibrate_train_poly(signal, p1_st, p2_st, t_st, x, d_st=d_st, best_deg=deg)

        binn_j = 5 * (k // 100 + 1)
        for w_idxs in subsample.reshape((subsample.shape[0] // binn_j, binn_j)):
            signal = normalized_planet[:, w_idxs].mean(axis=1)
            d = calibrate_train(signal, p1_j, p2_j, t_st_j, poly_j, d_st_j, x, method="Nelder-Mead")
            for w_idx_i in w_idxs:
                planet_d[w_idx_i].append(d)

for j in range(100):
    subsample = np.sort(np.random.choice(np.arange(283), 100, replace=False))
    signal = normalized_planet[:, subsample].mean(axis=1)
    t_st_j, d_st_j, p1_j, p2_j, poly_j, _ = calibrate_train_poly(signal, p1_st, p2_st, t_st, x, d_st=d_st, best_deg=deg)

    for w_idx in subsample.reshape((10, subsample.shape[0] // 10)):
        signal = normalized_planet[:, w_idx].mean(axis=1)
        d = calibrate_train(signal, p1_j, p2_j, t_st_j, poly_j, d_st_j, x, method="Nelder-Mead")
        for w_idx_i in w_idx:
            if w_idx_i <= 100:
                planet_d[w_idx_i].append(d)

为了更好地理解,您可以查看示意图:

流程示意图

此外,为了获得最佳分数,我们使用了不同 k_binn_wl 参数的混合。随着它减小,预测中的噪声增加,但有时准确性会提高,因为它负责将计算随机采样多项式的窗口长度。

Sigma 估计

为了估计 sigma,我们使用了梯度提升的集成,这是在预测特征上训练的。我们为每个行星预测了 2 个值,一个用于"好"波长,一个用于"噪声"波长。训练是在来自一颗星的预测特征上进行的,验证是在来自另一颗星的特征上进行的。顺便说一句,良好的 sigma 预测将我们的公共分数提高了 0.04 分。

结果

训练集上的平均 RMSE = 4.58e-5

训练集上"所有波长的平均值"情况的平均 RMSE = 5.75e-5

对我们无效的方法

  1. 预测后归一化 (Post pred normaliztion): 我们计划在获得凌日前系数后对描述通量的多项式进行归一化,以便子采样具有更多的物理意义,但由于未知原因,分数没有增加。
  2. 二维多项式 (2D Polynoms): 我们尝试构建描述整个归一化通量的二维多项式,但我们没有足够的时间投入这种方法。
同比赛其他方案