返回列表

1st place solution

360. 2019 Data Science Bowl | data-science-bowl-2019

开始: 2019-10-24 结束: 2020-01-22 学习效果预测 数据算法赛
第一名解决方案
作者: zr, ouyangxuan
比赛: Data Science Bowl 2019
排名: 第1名

感谢 Booz Allen Hamilton、Kaggle 以及所有人带来了这场精彩的比赛。同时感谢我的队友 @oyxuan。祝贺所有的获奖者!

1. 总结

我们选定的分数基于单个 LightGBM 模型(对多种子 5 折交叉验证的结果取平均)。

模型分数:

  • Private QWK: 0.568
  • Public QWK: 0.563
  • CV 加权 QWK: 0.591
  • CV 加权 RMSE: 1.009

2. 验证策略

在比赛初期,我们发现 LB(Leaderboard)分数不稳定,且与本地 CV(Local CV)相关性较低,因此我们决定只关注本地 CV 分数。我们尝试了几种方法来使本地 CV 稳定。以下是我们使用的两种验证集:

2.1 GroupK CV

我们使用了 5 次 * 5 折的 GroupK 交叉验证(按 installation_id 分组),每次使用随机的 GroupK 分割种子和随机列顺序。然而,QWK 在本地 CV 上仍然不够稳定,因此我们在验证想法时主要关注加权 RMSE,而忽略 QWK。对于加权损失,权重是每个样本的采样概率(我们使用完整数据,对于测试部分,我们计算采样概率的期望作为权重)。

2.2 Nested CV(嵌套交叉验证)

通常,上面的 GroupK CV 效果很好。当我们认为 GroupK CV 的决策置信度较低(例如与我们的常识不一致)时,我们会使用另一个嵌套集进行双重检查:我们在本地数据上模拟训练-测试分割:随机选择 1400 名拥有完整历史的用户用于嵌套训练,选择 2200 名历史被截断的用户用于嵌套测试。我们重复此过程 50~100 次,并计算平均分数进行验证。

3. 特征工程

我们大部分时间都花在了特征工程上。这几天我们生成了大约 20,000 个特征,并使用 null importance method(零重要性方法)选择了前 500 个特征。

  1. 大量统计数据(均值/总和/最后值/标准差/最大值/斜率),来源于真实尝试比率、正确真实比率、正确反馈比率等。基于相同评估或相似游戏的统计数据最为重要(相似游戏:我们将每个游戏映射到相应的相似评估,因为它们是相似的任务)。

  2. 我们从儿童历史数据的不同部分提取特征:1) 完整历史部分,2) 最后 5/12/48 小时,3) 从上一次评估到当前评估。由于存在一些设备共享现象,添加不同部分的信息可能对模型有帮助。

  3. 事件间隔特征(下一个事件时间戳 - 当前事件时间戳):按 event_id / event_code 分组的事件间隔统计数据(均值/最后值)。几个事件间隔特征显示出很高的重要性。

  4. 视频跳过比例:剪辑事件间隔 / 组织者提供的剪辑长度。(孩子是否跳过了视频?如果是,他在什么时候跳过?)

  5. 事件数据特征:事件数据中所有数值参数的统计数据(均值/总和/最后值)与 event_id / event_code 组合。我们从 specs 文件中获取组合和参数类型。例如:event_code2030_misses_mean

4. 特征选择

  1. 删除重复列。
  2. 截断对抗验证以确保没有泄漏和代码错误,平均对抗 AUC 应在 0.5 左右。
  3. 使用 null importance method(零重要性方法)选择前 500 个特征。

5. 模型

  1. 数据增强:模型在完整数据上训练(完整训练历史和测试之前的记录,提升 +0.002)。
  2. 损失函数:我们使用 RMSE 损失进行训练,使用加权 RMSE 损失进行验证。
  3. 阈值:然后使用 Optimizer Rounder 来优化加权 QWK 的阈值。
  4. 集成:我们尝试了一种简单的混合方法(0.8 * LightGBM + 0.2 * CatBoost),Private 分数为 0.570。由于 CV 分数没有提高,我们没有将其选为最终结果。

感谢阅读!

同比赛其他方案