返回列表

11th place solution OR Simpler is Better

524. G2Net Detecting Continuous Gravitational Waves | g2net-detecting-continuous-gravitational-waves

开始: 2022-10-04 结束: 2023-01-03 物理与天文 数据算法赛
第11名解决方案:越简单越好

第11名解决方案:越简单越好

作者:Volodymyr (Grandmaster)
比赛:G2Net Detecting Continuous Gravitational Waves
排名:11th Place

首先,我要感谢乌克兰武装部队、乌克兰安全局、乌克兰国防情报局、乌克兰国家紧急服务局,是他们提供了安全保障,让我能够参加这场盛大的比赛,完成这项工作,并助力科学、技术和商业不停滞、向前发展。

同时感谢 Kaggle 团队和竞赛组织者举办今年的 G2Net 探测连续引力波比赛。

与往年一样,我们处理的是模拟的引力波(GW)信号,但今年我们只有这些信号的 STFT(短时傅里叶变换)数据,这使得今年的任务略有不同。

数据

数据生成

在使用仅有的训练数据进行初步实验后,我意识到几乎不可能在此基础上构建一个好的深度学习模型,并使用 Roc-Auc 指标验证解决方案。因此,我决定使用 pyfstat 库开始生成数据。

我从训练集的负样本开始:我使用了原始训练样本中的 *_timestamps_*frequency_Hz,至于其他参数,我主要取自其中一个数据生成 Kernel:

generation_kwargs = {
        "sqrtSX": 0.5e-23,
        "detectors": "H1,L1",
        "Tsft": 1800,
        "Band": 1 / 5.01,
        "SFTWindowType": "tukey",
        "SFTWindowBeta": 0.001,
    }

我为每个训练样本生成了 100 个副本,并使用我最好的(基于 CNN 的)模型进行了对抗验证,得到了 0.5 的 Roc-Auc,这表明我的方向是正确的。
然后我对正训练样本重复了同样的操作,使用了以下额外参数:

random_param_dict = {
        "F1": lambda: 10 ** stats.uniform(-12, 4).rvs(),
        "cosi": lambda: stats.uniform(-1.0, 1.0).rvs(),
        "psi": lambda: stats.uniform(-0.25 * np.pi, 0.25 * np.pi).rvs(),
        "phi": lambda: stats.uniform(0, 2 * np.pi).rvs(),
        "Alpha": lambda: stats.uniform(0, 3.14159).rvs(),
        "Delta": lambda: stats.uniform(0, 3.14159).rvs(),
        "h0": lambda h0_center_: h0_center_ / stats.uniform(5, 90).rvs(),
    }

另一个重要步骤是在生成过程中移动信号,使其不垂直居中。我重复了对抗验证,再次达到了约 0.5 的 Roc-Auc。
下一步是对测试集重复相同的操作。但这比较棘手。测试集包含:

  • 非平稳噪声
  • 仪器伪影
    我决定只处理 非平稳噪声 问题。我通过简单的标准差计算和几次对抗验证迭代(训练集 vs 测试集)找到了几乎所有的非平稳样本。
    对于平稳样本,我重复了训练集生成操作(10 个正样本和 10 个负样本副本)。
    对于非平稳样本,我只是使用高斯分布生成测试样本副本:
def gen_multivar(ref_sample):
    locs = ref_sample.mean(axis=0)
    stds = ref_sample.std(axis=0)
    n_freqs = ref_sample.shape[0]
    return np.stack([np.random.normal(loc=loc, scale=scale, size=n_freqs) for loc, scale in zip(locs, stds)], axis=-1)

def gen_multivar_complex(ref_sample):
    return gen_multivar(ref_sample.real) + gen_multivar(ref_sample.imag) * 1j

然后我用所有生成的数据(约 24 万个样本)重复了对抗验证,并收到了约 0.5 的 Roc-Auc。所以我基本上准备好进行建模了!

数据预处理

我尝试了两种数据预处理方法:

  1. 带有分箱(binning)的基线方法 - 描述见这里。128 个分箱对我来说效果最好。
  2. Laeyoung 的带噪声注入的数据预处理方法 - 描述见这里。优于第一种选择,但仅限于推理时使用大量噪声 TTA(测试时
同比赛其他方案