返回列表

29th Discovery and Solution

670. NeurIPS - Ariel Data Challenge 2025 | ariel-data-challenge-2025

开始: 2025-06-26 结束: 2025-09-24 物理与天文 数据算法赛
第 29 名发现与解决方案 - 在噪声数据上训练鲁棒的神经网络

第 29 名发现与解决方案

副标题:在噪声数据上训练鲁棒的神经网络

作者: shanzhong8 及其团队

团队成员: @ajinomoto132, @chenzhenyuan, @atamazian, @larrylin666

排名: 第 29 名 (银牌)

发布日期: 2025-09-28

我想向 Kaggle 和伦敦大学学院表示诚挚的感谢,感谢他们主办了这次比赛。我学到了很多,这真是一次令人兴奋和有益的经历。我还要感谢我的队友 @ajinomoto132 @chenzhenyuan @atamazian @larrylin666 ——我们一起自豪地赢得了本次比赛的银牌。

总结

  • 预处理: 降噪
  • 第一阶段: 传输时间预测和噪声样本平滑
  • 第二阶段: 传输建模和端到端神经网络
  • 后处理: 传输模型的简单 refinements 和神经网络的基于 ML 的 sigma 预测

数据准备

基于官方提交 baseline,我们做了以下修改:我们采用了 5 的分箱因子以保留更丰富的时间信息,并应用背景噪声去除以提高信号质量。

数据增强

我们通过将每个信号与所有可用的校准文件配对来增强数据集,而不仅仅是其名义配对,以增加样本多样性并提高模型鲁棒性。

signal_0 + calibration_0 → sample1 
signal_0 + calibration_1 → sample2 
signal_1 + calibration_0 → sample3 
signal_1 + calibration_1 → sample4

平滑与归一化

def smooth_data_lambda_batch(train_signal, win=3):
    """
    Smooth spectral data with Gaussian filter (batch version).
    
    Args:
        train_signal: numpy array of shape (batch_size, n_channels, n_wavelengths)
        win: window half-size (default=3)
    
    Returns:
        Smoothed signal of shape (batch_size, n_channels, ?)
    """
    batch_size, n_channels, n_wavelengths = train_signal.shape

    def gaussian_kernel(size=7, sigma=1.0):
        x = np.arange(-size//2 + 1, size//2 + 1)
        g = np.exp(-(x**2) / (2*sigma**2))
        return g / g.sum()
    gauss_coefs = gaussian_kernel(size=7, sigma=1.0)

    # Slice region of interest
    q = train_signal[:, :, 40-win:322+win]  # (B, C, slice_len)

    # Normalize each channel by its mean (per batch & channel)
    q = q / q.mean(axis=2, keepdims=True)

    # Reference spectrum: mean across batch & channels
    q_coef = q.mean(axis=(0,1))  # shape (slice_len,)

    # Copy ROI for smoothing
    t_smooth = train_signal[:, :, 40-win:322+win].copy()

    # Loop over wavelengths inside ROI
    for l in range(win, t_smooth.shape[2]-win):
        coefs = q_coef[l-win:l+win+1] / q_coef[l]              # (2*win+1,)
        window = train_signal[:, :, 40-win+l-win:40-win+l+win+1]  # (B, C, 2*win+1)
        
        # Weighted Gaussian smoothing
        t_smooth[:, :, l] = np.tensordot(window * coefs, gauss_coefs, axes=([2],[0]))

    # Trim edges and reverse order
    if win > 0:
        t_smooth = t_smooth[:, :, win:-win][:, :, ::-1]
    else:
        t_smooth = t_smooth[:, :, ::-1]

    # Concatenate first column (wavelength=0) back
    first_col = train_signal[:, :, 0:1]  # (B, C, 1)
    return np.concatenate([first_col, t_smooth], axis=2)

然后我们在此之后进行归一化。

根据物理原理调整流程:

暗电流代表测量信号中的加性噪声分量。因此,它应该在非线性校正之前被减去,非线性校正旨在作用于真实的物理信号。在非线性变换中包含暗电流将违反这一假设并引入系统误差。
公式

益处:
在非线性校正之前应用暗电流减法确保多项式校正作用于更干净的信号,不受加性噪声的影响。这防止了暗电流分量被非线性变换放大或扭曲,从而产生更准确的信号校准和改进的下游性能。

建模

方法 1:带有滤波器内核、CNN 主干和投影层的神经网络。

方法 2:传输模型和树模型堆叠

可视化

下面展示了数据集中经常观察到的典型异常样本示例。

分布异常值

分布异常值示例

极端值

极端值示例

梯度异常

梯度异常示例

相位异常

相位异常示例

稳定性异常

稳定性异常示例

传输异常

传输异常示例

后处理

我们没有找出鲁棒的后处理方法。

结论

在这项工作中,我们在官方 baseline 的基础上,通过在数据预处理、增强、建模和校准方面引入一系列针对性的改进。这次比赛强化了仔细数据预处理的重要性,领域知识与机器学习的结合,以及迭代实验的重要性。

祝所有 Kaggle 选手好运,玩得开心!

同比赛其他方案