360. 2019 Data Science Bowl | data-science-bowl-2019
首先,恭喜所有的获奖者!这最终是一场有趣的比赛,数据中的信号并不多,而且评估指标的表现非常奇怪。这不是一个金牌解决方案,也许其中的几点对你们中的一些人来说仍然很有趣。
我在比赛结束前两周多一点才加入,没有任何期望。加入的主要原因是我想在这类数据上验证一些关于神经网络的想法,这也是我开始着手的地方。
在 NFL 比赛中,我学到了通过使用大小为 1 的卷积核,可以很好地在非时间序列数据上使用卷积神经网络(CNN)。所以我的想法是将其作为一种特征工程/理解的形式,而不需要我自己在工程部分花费太多时间。
我观察到有几件事对预测成功很重要。最重要的两件事是利用以前的评估和以前的其他活动的信息。因此,我为每个训练数据生成了两种形式的序列:所有先前会话的序列,以及所有先前评估的序列。序列中的每一步可以有多个特征,例如独热编码或嵌入标题。因此,评估序列可能看起来像:评估标题 1、评估标题 2 等。
在填充和重塑之后,我尝试在上面运行 LSTM 和 CNN,但很快发现几乎没有时间信息,所以我最终在会话序列上使用了卷积核大小为 2 的 CNN,在评估序列上使用了卷积核大小为 1 的 CNN。我将当前评估标题作为额外输入。
经过一些调整,这个神经网络在公共排行榜上得分约为 0.520,没有任何阈值调整。不过我总是只做快速提交,而且只在外部使用训练数据。然后我可能犯了一个错误。
我决定在一个公共内核上使用我的评估例程(稍后会详细介绍)来测试它。我也固执地想要利用测试集中所有可用的数据进行训练,所以我一定要在内核中训练我的模型。在我添加了例程和额外数据后,公共内核很快得分 0.557。所以我想:哇,我有一个很好的设置,让我试着改进它。所以我决定不把神经网络移植到内核,因为我的代码内存占用很大,我需要花几天时间调整它,还要检查它在更多数据上训练的效果如何。所以从这时起,我不再使用这个神经网络,但我仍然相信如果经过适当的调整和修正,它是有潜力的。我还想提到的是,公共内核有很多错误,我花了相当长的时间才找到大部分错误。我觉得下次最好从头开始。这是我第一次从一些公共内核开始。
我相信我想出了一个相当不错且稳健的 CV 设置,包括一种优化阈值的好方法。所以我做的是使用分层分组 K 折,最终的 CV 基于几千个截断样本的中位数得分。我相信有些人也是这样评估他们的模型的。不过我在阈值方面做的是,以优化这些截断样本的中位数得分的方式来优化阈值。然后我使用这些阈值来预测测试集。为了改进阈值优化,我用目标的直方图初始化了 Nelder Mead 算法。
如前所述,我认为数据中没有太多的信号。所以我没有在特征工程(FE)上花太多时间,尽管我相信一些精心设计的特征会有很大帮助。最后,我使用了事件代码、事件 ID、一些与评估相关的特征以及从事件数据中提取的少数特征。我尝试了其他方法,如对 json 数据进行 tfidf 等,但没有太大的成功。我在所有样本上进行训练,这意味着也包括从测试数据中提取的样本。
最后我专注于 LGB 和 Catboost。对于 Catboost,我明确利用了 has_time 参数,这对本次比赛非常完美,因为它根据其拥有的时间信息对分类变量进行编码,因此只使用该时间点之前的样本。我还明确添加了 assessment_id 作为分类变量,因为本地测试表明,如果我将以前的记录添加到训练中,它将有助于私人排行榜得分。
我试图尽可能稳健,所以我决定了以下方案:15 次 10 折,对于这 15 个袋中的每一个,拟合 catboost 和 lgb,使用排名平均进行融合,其中 catboost 占 25%,lgb 占 75%。像上面一样优化截断阈值。基于所有 10 折的排名平均均值预测测试,然后最后对所有 15 个袋进行多数投票。我对此很高兴,因为我最终设法选出了我最好的私人排行榜得分之一。
我有两个“疯狂”的想法。我认为第一个很简单,应该可以奏效,但最后一天我在内核上有一个错误,尽管即使有这个错误它在私人排行榜上得分最高,但我没有选择它。这个想法很简单,在测试预测上拟合 MinMaxScaler 或 QuantileTransformer,用它转换 oof(袋外)预测和测试预测。然后在 oof 上进行阈值优化,然后将其应用于测试。这使它们处于相似的范围内和尺度上,并且比排名预测有一些优势。在我几乎所有模拟测试数据的本地实验中,这都提高了测试数据上的 QWK。我认为这可以带来一些分数的提升,但我必须再次测试。
第二个想法再次涉及 CNN。想法是使用 CNN 来找到样本的最佳阈值。我的想法是对 oof 上的预测进行重复子采样(也可以截断),并计算这些子样本的最佳阈值。这些子样本的预测然后成为