626. NeurIPS - Ariel Data Challenge 2024 | ariel-data-challenge-2024
感谢本次比赛的参与者和组织者。比赛非常有趣且具有教育意义。我希望一年后能在 Kaggle 上看到 Ariel 比赛。
我们使用了多项式近似方法。非常感谢 Sergey 的分享。我们方法的主要区别在于使用了整个信号,没有 cut 掉进入/退出凌日的时刻。您可以在这个 notebook 链接 查看所有代码。
凌日相位检测算法分析信号的时间序列,计算滑动窗口中的导数,以识别光强度的突然变化,这是行星进入和退出凌日状态的特征。
基于导数的极值,确定凌日第一和第二相位的中点。为了 clarify 第一相位的开始,信号被分为两个线性部分并进行误差最小化,从而可以准确确定凌日的开始。总之,该算法返回进入/退出索引以及进入/退出凌日的过渡持续时间。
由于不知道可以模拟凌日的函数的一般格式,我们选择了这个函数,因为它平滑,可以很好地近似 piecewise 真实函数。后来使用 UNIFORM 格式并没有导致分数增加,我们决定保留平滑版本。
凌日校正示例:
我们的主要流程通过执行波长 binning 聚合并选择随机样本索引来计算目标。
步骤:
p1, p2, 和 t,分别代表凌日开始、凌日结束和过渡到凌日的持续时间。d_st,它代表目标的平均预测(在我们的代码中表示为 "d")。在这一步,我们还优化第一步中获得的其他参数。2 * k_binn_wl 且步长为 k_binn_wl // 2 的移动窗口,我们迭代波长索引。k_binn_wl 个波长。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,我们使用了梯度提升的集成,这是在预测特征上训练的。我们为每个行星预测了 2 个值,一个用于"好"波长,一个用于"噪声"波长。训练是在来自一颗星的预测特征上进行的,验证是在来自另一颗星的特征上进行的。顺便说一句,良好的 sigma 预测将我们的公共分数提高了 0.04 分。
训练集上的平均 RMSE = 4.58e-5
训练集上"所有波长的平均值"情况的平均 RMSE = 5.75e-5