返回列表

33th Place Solution - 1D-Unet with GRU, Detect repeating signals

586. Child Mind Institute - Detect Sleep States | child-mind-institute-detect-sleep-states

开始: 2023-09-05 结束: 2023-12-05 健康管理与公共卫生 数据算法赛
第33名解决方案 - 1D-Unet结合GRU,检测重复信号
作者:kfuji
排名:第33名
发布时间:2023-12-06

首先,我们要向主办方表示感谢,感谢他们组织了这场引人入胜的比赛。

这是我首次有机会挑战事件检测任务,通过参与本次比赛,我获得了宝贵的经验。

团队成员

@sugupoko

概述与总结

我们使用了 @tubotubo 优秀的笔记本和代码,并实施了以下改进:

  • 集成(多时长、多编码器模型)
  • 在1D-Unet中插入BiGRU
  • scipy.signal.find_peaks的参数调优
  • 检测和去除重复信号

我将按照我们在比赛中采用的顺序来解释这些方法。

集成方法

在这项事件检测任务中,我们推测通过对多个模型的输出进行平均集成,可以获得更准确的预测结果。因此,我们采用了以下集成策略:

多时长集成

我们训练了输入时长分别为8小时(5760步)、16小时(11520步)和24小时(17280步)的模型。在推理过程中,我们对这些模型的输出结果取平均值。

多编码器模型集成

对于编码器模型,我们采用了timm-gernet-l、resnext101和se-resnet50,并以与时长集成类似的方式对这些模型的结果进行平均。

在1D-Unet的跳跃连接中插入BiGRU

@sugupoko 的想法启发,我们在1D-Unet解码器的跳跃连接中插入了BiGRU。我们相信这提高了模型在时间维度上的预测准确性。

scipy.signal.find_peaks的参数调优

在进行多次实验时,我们发现用于后处理的 scipy.signal.find_peaks 函数的参数对准确性有影响。

最初,我们将 height(score_th)降低到0.001,因为根据本次比赛的评估指标,设置较低的阈值是有利的。随后,我们将 distance 调整为65。这个参数决定了峰值之间的距离,我们相信设置合适的值有助于减少假阳性。

检测重复信号

在分析数据时,我们注意到某些输入数据包含不自然的周期性信号。在许多情况下,这些信号没有事件标签,可能成为假阳性的原因。

虽然我们不了解这些信号出现的具体原因,但发现它们大约每24小时(17280步)出现一次。因此,我们尝试使用基于规则的方法来去除这些重复信号。

我们创建了一个检测重复信号的函数,具体方法如下:将anglez数据按17280步的间隔分段,计算前一段与当前段的相关系数。如果该相关系数超过某个阈值,则判定为重复信号。通过使检测到重复信号区域的模型输出无效,我们成功显著减少了假阳性。

def detect_repeated_area(series_id, cycle_length=17280, cor_th=0.8, phase='test'):
    anglez = np.load(f"{CFG.processed_dir}/{phase}/{series_id}/anglez.npy")
    
    valid_area = np.ones(anglez.shape[0])
    x1_list = list(range(0, anglez.shape[0], cycle_length))
    pre_anglez = np.zeros(cycle_length)
    for x1 in x1_list:
        x2 = x1 + cycle_length
        cur_anglez = anglez[x1:x2]
        
        if len(cur_anglez) < cycle_length:
            cur_anglez = np.pad(cur_anglez, (0, cycle_length - len(cur_anglez)), constant_values=0.0)
        
        correlation_coefficient_anglez = np.corrcoef(pre_anglez, cur_anglez)[0, 1]
        
        if correlation_coefficient_anglez > cor_th:
            valid_area[x1-cycle_length:x2] = 0
        
        pre_anglez = cur_anglez
        
    return valid_area

LB分数变化:

  • 基线:0.707
  • (5折集成:0.730)
  • 多时长集成:0.745
  • 多编码器模型集成:0.746
  • 在1D-Unet中插入BiGRU:0.756
  • scipy.signal.find_peaks参数调优:0.759
  • 检测重复信号:0.764

不太成功的地方:

  • 利用睡眠状态预测
  • 集成更长和更短的时长
同比赛其他方案