返回列表

5th place solution

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

开始: 2023-09-05 结束: 2023-12-05 健康管理与公共卫生 数据算法赛
第5名解决方案

第5名解决方案

作者: Ruby

发布日期: 2023年12月6日

投票数: 62

比赛排名: 第5名

感谢Kaggle和比赛主办方提供了这场有趣的竞赛,该竞赛可以通过多种方法来解决。探索这个数据集的旅程非常愉快。 同时也要特别感谢在比赛过程中分享见解和想法的人们,从你们那里我学到了很多。

概述

我将这个问题分为四个阶段来解决:

  1. 通过启发式规则生成候选步骤
  2. 步骤修正模型以提高步骤质量
  3. 评分模型为提交生成分数
  4. 后处理

候选步骤生成

启发式规则的基本思想,您可以查看代码以获取更多详细信息和技巧。

  • 对于|diff(anglez)|<5的区域:开始->入睡,结束->醒来。入睡/醒来不太可能发生在非活动区域的中间。具有可疑伪造数据的区域(检测此类区域的规则稍后描述)会被移除。
  • 被非活动区域扩展的伪造区域:开始->醒来,结束->入睡。一个可能的解释是,只有在人醒着的时候才可能发生摘下手表的行为。
  • 当在720*2范围内没有其他候选时,当前候选步骤会移动+/-720。

这三条规则总共为所有序列生成了254653个候选步骤,最佳可能得分为0.9006。

步骤修正模型

  • 使用Lightgbm L1回归,目标为(nearest_target_step-step)
  • 由于我们只关心与目标匹配的步骤质量,|target|>=360的数据点权重设为零
  • 数据点通过threshold_class_width^(-6)加权,重点关注接近目标的数据点,因为我认为当真实目标很远时,准确预测差距是不可能的。(threshold_class_width示例:120
  • 由于minute%15和second是最重要的特征,我认为这个阶段主要是修正标签生成过程中的偏差,而不是真正提高步骤质量。这个阶段的大部分增益实际上来自将步骤移动约-11,这在特征重要性列表中并未体现。
  • 为了在不泄露的情况下验证下一阶段,通过series_id进行5折分组K折交叉验证,共2*5*5个模型。

此阶段后的最佳可能得分为0.932。

评分模型

  • 使用Lightgbm交叉熵目标
  • 对于每个目标最近的数据点,target=max(0,1-|nearest_target_step-step|/360),否则目标设为零
  • 负样本点(target=0)在|nearest_target_step-step|>/<360时通过*0.7/0.4降权
  • 目标基于上一阶段给出的修正步骤的袋外预测创建
  • 我为入睡和醒来候选创建不同的模型,并通过series_id进行5折分组K折验证,共2*5个模型

我在后处理后计算比赛指标,因此此处不报告分数,但很容易添加。

后处理

这包括三个部分:

  • 如果step%12=0,则step+/-1以匹配更多目标步骤
  • 对于间隔<720的两个候选,仅当满足以下条件时保留:
    min(|gap|/720,1)*(exp_score1*exp_score2/(exp_score1**2+exp_score2**2))**0.5>0.083
    其中
    exp_score=np.exp(np.arctanh(2*score-1))
    否则移除分数较小的那个。这可以避免候选过于密集,且仅当模型对候选的偏好明显偏斜时才生效。
  • 如果某天某系列的总分和大于1,则该天所有分数除以总分和

后处理后CV分数0.825,公开LB分数0.783,私有LB分数0.844。

更多细节

  • 伪造区域
    1. anglez 5分钟均值(6位小数精度)在同一序列中出现超过一次
    2. anglez 5分钟标准差>0.5,避免将一些非活动区域标记为伪造
    3. 将长伪造区域包围的区域标记为伪造,如GGIR网站所述
  • 数据清洗
    1. 通过手动检查移除一些具有许多错误标签的序列
    2. 被长时间未标记尾部区域覆盖的数据点权重设为零
    3. 与具有意外anglez分布的目标相关的数据点权重设为零(入睡后接活动区域,醒来后接非活动区域)

    这些情况仅从训练过程中移除,计算CV分数时仍包含它们。

  • 特征

    总共2040个,我只描述最重要的,其余的可以重复、不重要或无用。您可以查看代码获取更多详细信息。

    1. 基于窗口的特征:源列 X 统计量 X 窗口大小 X 窗口操作,非全组合
      源列:anglez_abs_diff, enmo_abs_diff, anglez_abs_diff_quantile, smoothed_anglez_abs_diff, anglez_abs_diff_in_given_range, fake_mark, 通过GGIR启发式规则的sleep_mark, ...
      统计量:mean/50 quantile/95 quantile/max/min
      窗口大小:1min,3min,5min,10min,15min,30min,1h,2h,4h,8h,12h
      窗口操作:左窗口(lw), 右窗口(rw), (lw-rw), [(lw-rw)/(lw+rw)], 连接(lw,rw), [(lw-rw)/连接(lw,rw))]
    2. 时间特征
      weekday, hour, second, minute, second_in_day, step/max_step
      minute%15(如讨论https://www.kaggle.com/competitions/child-mind-institute-detect-sleep-states/discussion/444374
    3. 按天聚合的特征统计
      主要是fake_mark和sleep_mark
    4. 通过启发式方法给出的序列中平均事件时间的步骤间隔
    5. 步骤时间的统计值
    6. 附近候选的步骤间隔,以及一些基于特征重要性排名靠前的特征值间隔,手动挑选
同比赛其他方案