第 8 名解决方案
第 8 名解决方案
作者: Ruby (MASTER)
竞赛排名: 8
发布时间: 2024-11-01
感谢 Kaggle 和竞赛主办方举办这场有趣的竞赛,特别感谢 sergeifironov 提供的优秀入门笔记本,我基本上遵循了相同的方法并添加了一些细节。
数据处理
- 几乎与公开笔记本相同,为最后 60 个波长再移除两个维度
相位分割
- 通过边界点的多项式拟合去趋势
- 通过累积梯度找到间隙中心
- 基于单调条件找到精确的间隙边缘
模型 1
- transit_depth=(oot-it)/oot, transit_depth 是线性方程中 oot 项前的系数,所以这可以直接通过 OLS 求解
- 拟合所有波长的平均值
- 先通过分位数回归拟合,移除残差大的点,然后通过 OLS 拟合。相同的点也会在模型 2 中被移除,无需再次运行分位数回归。这使得模型对不清晰的相位边缘具有鲁棒性。
模型 2
- 对所有波长应用 SVD 并用主成分重构它们,在 SVD 之前根据不同波长的信噪比 (SNR) 进行加权
- 对邻近波长进行指数平滑,根据不同波长的信噪比 (SNR) 进一步加权
- 前两个操作仅应用于 ch0
- 使用模型 1 中的相同方式独立拟合所有波长
- 基于 OLS 系数标准误和残差相关性的系数协方差
集成
- 基本模型在分箱为 12*10, 10 的数据上运行,然后我对 10 个具有偏移起始索引的结果取平均。当分箱大小变小时,变量误差开始产生显著影响
后处理
- 对模型 2 系数应用 SVD 以获得前 k 个主成分(3/4 对训练/测试集最佳,因为测试分子是训练集合的超集),然后通过带有协方差收缩的 GLS 重构系数,模型 2 的协方差基于 OLS 进行转换,因为简单的 GLS 协方差似乎低估了实际方差。
- base_coef=0.6*coef1+0.4*coef2
- base_coef*mean(coef2)/mean(coef1) 以处理由波长间能量分布不平衡引起的偏差
- 当 coef1 和 coef2 之间存在显著差异时,用 coef2 替换 base_coef,这是在行星 - 波长级别和行星级别完成的。
- base_coef 的 sigma: max(|coef1-coef2|, coef_std2) 想象我们从偏差较小的模型 2“观察”偏差较大的模型 1。coef1 的 Sigma 由全局 coef1 和 coef2 之间的平均差距界定,这在准确的 coef2 估计不可行时有效
- coef2 的 sigma: (2*coef_std+max coef gap between nearing wavelength), 因为模型 2 仍然存在偏差且数据中存在未知偏差。我基于一些启发式规则扩展了 coef_std2
- 我添加了一些规则来捕捉模型可能失败的情况,并替换为默认结果,但似乎它们在训练集和公共测试集上从未生效,不确定它在私有部分是否生效。
复现
https://www.kaggle.com/code/w5833946/adc-final-reproduce
我也在 ver1 中用训练集运行了它。