第5名解决方案
第5名解决方案
感谢Kaggle和比赛主办方提供了这场有趣的竞赛,该竞赛可以通过多种方法来解决。探索这个数据集的旅程非常愉快。
同时也要特别感谢在比赛过程中分享见解和想法的人们,从你们那里我学到了很多。
概述
我将这个问题分为四个阶段来解决:
- 通过启发式规则生成候选步骤
- 步骤修正模型以提高步骤质量
- 评分模型为提交生成分数
- 后处理
候选步骤生成
启发式规则的基本思想,您可以查看代码以获取更多详细信息和技巧。
- 对于|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。
更多细节