524. G2Net Detecting Continuous Gravitational Waves | g2net-detecting-continuous-gravitational-waves
首先,我要感谢乌克兰武装部队、乌克兰安全局、乌克兰国防情报局、乌克兰国家紧急服务局,是他们提供了安全保障,让我能够参加这场盛大的比赛,完成这项工作,并助力科学、技术和商业不停滞、向前发展。
同时感谢 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 测试集)找到了几乎所有的非平稳样本。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。所以我基本上准备好进行建模了!
我尝试了两种数据预处理方法: