返回列表

10th place Solution

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

开始: 2019-10-24 结束: 2020-01-22 学习效果预测 数据算法赛
第10名解决方案

第10名解决方案

作者: pao (Grandmaster) | 比赛排名: 第10名 (Solo Gold)

首先,感谢 Kaggle 团队举办这场激动人心的比赛,同时也祝贺所有获胜团队和取得优异成绩的团队。
我独自一人参加了这次比赛,虽然过程艰难,但这确实是一场非常有趣的比赛。

一年前,我在 Microsoft Malware 竞赛中经历过一次非常大的排名下滑(从第2名跌至约1500名)。
基于那次经验,我在本次比赛中特别致力于验证策略和公开/私有数据分析。
结果,我通过排名上升获得了我的第一枚金牌。

以下是我的解决方案。(很抱歉我的英语不太好。)

结果

第10名(单人金牌) / 3523支队伍

模型

  • LightGBM x 6 平均
    • 每个模型的 CV 种子和一些超参数都有所调整。
    • 对回归值进行平均后,通过阈值将其转换为整数 accuracy_group。

验证

  • 分层分组 K折交叉验证,10折。
  • 所有验证分数均通过截断验证计算。
    • 对每个 installation_id 进行随机抽样评估。
  • 在每一折中,我使用了 51 个截断验证集。
    • 1 个集合用于早停。
    • 50 个集合用于通过平均 QWK(二次加权卡帕)计算验证分数。

公开榜 vs 私有榜

我认为公开数据集的分布不适合用于验证,因为只有 1000 条记录。
我通过以下方式计算:对训练集的 OOF(样本外)预测进行截断并随机抽样 1000 行,重复 1000 次取平均值。
直方图如下所示。

Histogram

从这个直方图来看,公开数据集似乎属于罕见情况。

因此,我选择信任 CV(忽略 LB),并使用 CV 表现最好的阈值(下一节详述)。

QWK 阈值

最终我使用了常数阈值 [1.04, 1.76, 2.18]。
该阈值是通过在 500 个截断 OOF 验证中取 OptimizedRounder 阈值的平均值计算得出的。

我尝试了许多方法,但我相信局部 CV 预测中的最大阈值是最可靠的。

一些公开内核根据目标分布决定阈值。
在我的实验中,该方法在公开 LB 上的表现优于其他方法,但我认为该方法对公开 LB 过拟合了,因为其分布不等于截断后的目标分布,也不是 QWK 的最佳分布。

特征工程

我总共制作了 3000~5000 个特征,但我认为没有“魔法特征”。
(最终我使用了大约 300 个特征。)

对我来说有效的特征如下:

  • 归一化准确率特征
    • 我对准确率特征进行了归一化,因为不同标题的评估和游戏的难度是不同的。
    • 公式:(Accuracy - Accuracy_mean_per_title) / Feature_std_per_title
    • 准确率特征包括 accuracy_group、n_true_attempts/all_attempts、correct/event_num 和 correct/(correct+false) 等...
  • 按标题分类的特征
    • 我按标题制作特征,因为游戏中关卡的不同使得在事件数据中很难找到公共列。
    • 例如:Air Show 中的 target_distances 长度。
    • 然而这花费了大量时间,所以我只制作了约 10 个标题(游戏、评估)的特征后就放弃了...
  • 相对特征
    • 例如:event_code: 4020_count / 4070_count,last_accuracy / all_accuracy_mean

特征选择

为了评估特征在截断验证中的效果,我使用了基于截断训练数据的 LGB 特征重要性。
在每一折中,我制作 50 个截断数据集,并利用 lightgbm 的 init_model 参数每 5 次迭代更换一次数据集。

我使用了前 300 个特征(

同比赛其他方案