返回列表

2nd solution write up.

417. Tabular Playground Series - Jan 2021 | tabular-playground-series-jan-2021

开始: 2021-01-02 结束: 2021-01-31 数据算法赛
第二名方案分享

第二名方案分享

作者: Ren | 排名: 第2名

很抱歉我没有太多时间来写一篇冗长而详细的解决方案帖子。作为一个在疫情期间独自照顾两个小孩的职场爸爸,独处的时间非常宝贵。

所以我参加这次比赛的方法分为两部分:一部分是枯燥的,另一部分是有趣的。

枯燥的部分

这部分包括调整我以前的比赛代码,调优并训练我熟悉的任何模型,并保存折外预测结果用于堆叠。由于这个数据集表面上只需要很少的处理,我花了2小时编写代码,然后家里的一台备用机器整整运行了一个月。最终,它输出了10个GBT模型(3个lightgbm,4个xgboost,3个NGBoost),2个SVM,1个KNN,2个Ridge,1个随机森林和1个正则化贪婪森林。

有趣的部分

我想这部分主要是寻找能够接近树模型效果的神经网络(NN)。我主要在周末做这件事。我简要尝试了DAE(去噪自编码器),但没能让它跑通。所以我使用了交换噪声部分来训练有监督的神经网络,希望这至少能稍微激励一下网络,结果确实有帮助。这里有一些相关的代码片段:

def add_swap_noise_torch(X, ratio=.15, col_to_apply=[], return_mask=False):
    obfuscation_mask = torch.bernoulli(ratio * torch.ones(X.shape)).to(X.device)
    if col_to_apply:
        column_mask = torch.zeros(X.shape).to(X.device)
        column_mask[:, col_to_apply] = 1
        obfuscation_mask *= column_mask.float()
    obfuscated_X = torch.where(obfuscation_mask == 1, X[torch.randperm(X.shape[0])], X)
    if return_mask:
        return obfuscated_X, obfuscation_mask
    return obfuscated_X

基本上,我用这个函数给每个小批量添加噪声。有了这个噪声和对MLP结构的一些调整,我将神经网络的CV降到了0.702。此时,我很确定DAE是关键所在,但我认为我没有足够的时间和精力真正让它运作起来。我有一种感觉,每个输入变量是由多个组成部分合成的,如果我能以一种有意义的方式将它们分解成更小的部分,我就能进一步帮助神经网络。

所以我发现了DAE的“矮人”版本,即RandomTreesEmbedding。我的神经网络在这个特征(与原始输入水平堆叠)上进行了训练,并且交换噪声仅应用于原始输入,最终我的神经网络CV降到了0.698。最后,我训练了大约6个略有不同的神经网络。

最终提交

我的最终提交是一个岭回归,堆叠了上述所有模型。我不打算分享更多的代码了,因为一个疲惫的爸爸在凌晨2点写的代码是不可读的。

同比赛其他方案