返回列表

13th Place Solution

454. G2Net Gravitational Wave Detection | g2net-gravitational-wave-detection

开始: 2021-06-30 结束: 2021-09-29 物理与天文 数据算法赛
第13名解决方案

第13名解决方案

作者: Pawan KS 及其团队
比赛排名: 第13名

我要感谢我的队友 @sakshamaggarwal@darkravager@callmeb@mrigendraagrawal,以及组织者和 Kaggle 社区,感谢我们在这次比赛中获得的精彩体验。

预处理:

感谢 @callmeb

  • 平均功率谱密度:我们将平均 PSD 计算为简单的运行平均值,并将其存储以用于后续的归一化:
train0 = train[train.target==0].reset_index(drop=True)
DET = None
for idx, (id, target, path) in tqdm(train0.iterrows(), total=len(train0)):
    ts = np.load(path)
    ts = ts_window(ts)
    ts = ts_whiten(ts)
    ts = torch.tensor(ts)
    fs = torch.fft.fft(ts)
    if DET == None:
        DET = fs.abs()
    else:
        DET = (fs.abs() + idx * DET) / (idx+1)
  • 数据白化:你可以使用任何你喜欢的白化方法。这是我们使用的众多解决方案之一。
WINDOW=signal.tukey(4096, 1/4)[None,:]
def ts_window(ts):
    return ts * WINDOW
def ts_whiten(ts, lf=24, hf=364, order=4):
    sos = signal.butter(order, [lf, hf], btype="bandpass", output="sos", fs=2048)
    normalization = np.sqrt((hf - lf) / (2048 / 2))
    return signal.sosfiltfilt(sos, ts) / normalization
  • 加载数据后,我们按如下方式对信号进行归一化
ts = ts_window(ts)
ts = ts_whiten(ts)
ts = torch.fft.ifft(fs).real
fs = fs / DET
ts = torch.fft.ifft(fs).real
(你也可以在这里重用窗口)

数据增强

  • 随机通道打乱
  • 随机滚动(时间平移)

方法

使用了分层 5 折训练策略。我们有一些想法,这些想法对其原生方案有一点提升。具体方法如下:

  • 3 通道(原生) - 将检测器按通道堆叠。
  • 6 种排列 - 我们将 3 个检测器以不同的排列方式水平堆叠。然后按通道堆叠这 6 种排列。
  • CQT+CWT - 我们从 CQT 变换中提取 3 个通道(对应 3 个检测器),从 CWT 变换中提取 3 个通道,并将它们堆叠在一起。
  • 双重 CWT - 创建了两个具有不同参数的并行 CWT 变换,其思路是一个变换具有更好的频率分辨率,另一个具有更好的时间分辨率。

注意并行 关键字表示一种修改后的架构,我们在其中同时训练两个 CNN 骨干网络,并将它们的 GAP(全局平均池化)输出拼接,随后接两个全连接层。

我们训练了不同复杂度的骨干网络,这些网络可能使用特定方法或方法的组合。模型在图像尺寸和频率范围上也有所不同。
模型列表

模型集成

  • 最后我们大约有 50 个模型,其中最好的模型得分为 0.8808。
  • 通过加权平均,我们在公共 LB 上达到了约 0.8823(私有 LB 0.88047)。
  • 切换到使用 sklearn 的 MLP 分类器进行堆叠
同比赛其他方案