返回列表

14th place solution

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

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

第14名解决方案

作者: Kha Vo (Grandmaster) 及其队友 @alijs1, @johnpateha, @kazanova
比赛: Data Science Bowl 2019

首先,我要感谢主办方、Kaggle以及所有人举办了这场精彩的比赛。我要向我的队友 @alijs1 @johnpateha @kazanova 表达最深切的感谢。对我来说,这是一段非常美好和快乐的时光。

我将简要介绍我们的解决方案,如果我遗漏了什么,我的队友们可以从他们的角度进行补充。

特征工程

除了公共内核中可用的一些流行特征外,我们还设计了一些自定义特征,例如活动会话中良好操作/所有操作的比率、误点击或误拖拽操作/操作计数(或会话持续时间)的比率、自上次评估会话以来某些特定事件代码的计数。最有趣的特征是与每个数据样本相关的同一评估的统计数据。这类特征有助于树模型更快收敛,并降低评估标题的重要性。

作为一个独立的解决方案,Marios (@kazanova) 制作了属于他自己的特征集,该特征集考虑了训练集/测试集的不匹配问题。如果需要,他可以分享更多相关内容。

数据增强

令人惊讶的是,我们之前没有意识到可以通过大量带有真实标签的测试样本来增强训练数据。每当一个测试集 installation_id(以下简称“id”)有超过 0 个先前评估时,我们可以截断用户历史记录并制作额外的训练样本。这种增强在我们的融合中帮助很大。

建模

  • 模型 1:针对所有评估的主模型
  • 模型 2:针对每种评估分别建立五个模型,然后连接结果。

除了使用所有原始数据(17690行)作为主基础模型外,我们注意到如果与主基础模型适当融合,针对每种类型训练5个独立的子模型可以带来提升。而且由于我们也有数据增强的选项,因此总共产生了4种不同的训练策略。

  • 寻找阈值: 我们使用一个简单的优化器基于纯交叉验证(CV)来寻找阈值。人们太在意寻找正确的阈值,但我们不这样。相反,我们更关心建模和集成,因此阈值的影响较小。
  • 带样本权重训练 我们发现在训练中使用适当的样本权重可以显著提升 LB 分数。CV 可能提升不多,但 LB 提升了。我们使用先前评估的数量作为为每个样本分配权重的标准。这里的问题在于,我们不能简单地使用训练集/测试集中该标准的直方图来计算权重。问题在于来自同一个 id 的样本非常相似,因此单个 id 中每个单独样本的影响应该下降。例如,如果训练数据中 0-先前评估样本的比例是 1/4,而测试数据中 0-先前评估样本的比例是 1/2,那么我们不能简单地为训练中所有 0-先前评估样本分配权重=2,而是一个较小的值。最后,我们没有想出一个理论上具体的策略来获取权重,只是粗略估计了一下。我们选择 [1.65 , 1.09, 0.87, 0.77, 0.57, 0.47] 分别作为 0-先前、1-先前、2-先前、3-先前、4-先前 和 超过4-先前 评估样本的权重。

模型融合

  • 基于分类器逻辑的融合 我们发现了一种很好的方法来结合主模型结果与 5-子模型结果。我们训练了 3 个带有 AUC 损失的简单分类器:A) 区分类别 0/1,B) 区分类别 1/2,C) 区分类别 2/3。然后我们使用以下自定义逻辑将模型 1 和模型 2 的 2 个浮点预测结果组合成类别标签:
Abs(model1_int – model2_int) model1_int model2_int 分类器 结果
0 model1_int
1 0 (或 1) 1 (或 0) A >= 0.2 1
1 0 (或 1) 1 (或 0) A < 0.2 0
1 1 (或 2) 2 (或 1) B >= 0.5 2