586. Child Mind Institute - Detect Sleep States | child-mind-institute-detect-sleep-states
首先,我们要向主办方表示感谢,感谢他们组织了这场引人入胜的比赛。
这是我首次有机会挑战事件检测任务,通过参与本次比赛,我获得了宝贵的经验。

我们使用了 @tubotubo 优秀的笔记本和代码,并实施了以下改进:
我将按照我们在比赛中采用的顺序来解释这些方法。
在这项事件检测任务中,我们推测通过对多个模型的输出进行平均集成,可以获得更准确的预测结果。因此,我们采用了以下集成策略:
我们训练了输入时长分别为8小时(5760步)、16小时(11520步)和24小时(17280步)的模型。在推理过程中,我们对这些模型的输出结果取平均值。
对于编码器模型,我们采用了timm-gernet-l、resnext101和se-resnet50,并以与时长集成类似的方式对这些模型的结果进行平均。
受 @sugupoko 的想法启发,我们在1D-Unet解码器的跳跃连接中插入了BiGRU。我们相信这提高了模型在时间维度上的预测准确性。
在进行多次实验时,我们发现用于后处理的 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
