返回列表

8th place solution

388. TReNDS Neuroimaging | trends-assessment-prediction

开始: 2020-04-23 结束: 2020-06-29 医学影像分析 数据算法赛
第8名解决方案
作者: Y.Nakama (Grandmaster), LIGHT (Grandmaster)
比赛: Trends Assessment Prediction
排名: 第8名

第8名解决方案

我们(@yasufuminakama, @berserker408)感谢 Kaggle 和主办方举办了这场有趣的比赛,感谢所有参赛者给了我们很多启发。同时祝贺获胜者!

方案概览

Solution Overview

3D 地图特征

我们使用 3D-Resnet10 提取了 512 个 3D 地图特征。
正如我在外部数据主题中发布的,我们使用了 @shentao 分享的数据(见 https://www.kaggle.com/c/trends-assessment-prediction/discussion/147797)。更多细节可以查看他的讨论。非常感谢他。
正如 https://www.kaggle.com/c/trends-assessment-prediction/data 中所写:

分数(见 train_scores.csv)不是原始的年龄和评估值。它们经过了转换和去标识化,以帮助保护受试者身份并最大限度地减少数据被不道德使用的风险。尽管如此,它们是直接从原始评估值得出的,因此与提供的特征同样可能存在关联。
在转换之前,出于隐私原因,训练集中的年龄四舍五入到最近的年份。然而,测试集中的年龄没有四舍五入到年份(精度更高)。因此,严重过拟合训练集年龄很可能会对您的提交产生负面影响。

我们需要避免对训练数据的过拟合,为了做到这一点,3D 地图特征帮了大忙。

模型

我们使用了填充数据,通过 SVM+Ridge 进行填充。

神经网络 (NN)

NN 基础结构如下:

class CFG:
    hidden_size1=64
    hidden_size2=128
    hidden_size3=6
    dropout=0.5

class TabularNN(nn.Module):
    def __init__(self):
        super().__init__()
        self.mlp1 = nn.Sequential(
                          nn.Linear(26, CFG.hidden_size1),
                          nn.BatchNorm1d(CFG.hidden_size1),
                          nn.Dropout(CFG.dropout),
                          nn.PReLU(),
                          nn.Linear(CFG.hidden_size1, CFG.hidden_size1//2),
                          nn.BatchNorm1d(CFG.hidden_size1//2),
                          nn.Dropout(CFG.dropout),
                          )
        self.mlp2 = nn.Sequential(
                          nn.Linear(1378, CFG.hidden_size2),
                          nn.BatchNorm1d(CFG.hidden_size2),
                          nn.Dropout(CFG.dropout),
                          nn.PReLU(),
                          nn.Linear(CFG.hidden_size2, CFG.hidden_size2//2),
                          nn.BatchNorm1d(CFG.hidden_size2//2),
                          nn.Dropout(CFG.dropout),
                          )
        self.mlp3 = nn.Sequential(
                          nn.Linear(512, CFG.hidden_size3),
                          nn.BatchNorm1d(CFG.hidden_size3),
                          nn.Dropout(CFG.dropout),
                          nn.PReLU(),
                          nn.Linear(CFG.hidden_size3, CFG.hidden_size3//2+1),
                          nn.BatchNorm1d(CFG.hidden_size3//2+1),
                          nn.Dropout(CFG.dropout),
                          )
        self.head = nn.Sequential(
                          nn.Linear(CFG.hidden_size1//2+CFG.hidden_size2//2+CFG.hidden_size3//2+1, 
                                    CFG.hidden_size1//2+CFG.hidden_size2//2+CFG.hidden_size3//2+1),
                          nn.BatchNorm1d(CFG.hidden_size1//2+CFG.hidden_size2//2+CFG.hidden_size3//2+1),
                          nn.Dropout(0.1),
                          nn.Linear(CFG.hidden_size1//2+CFG.hidden_size2//2+CFG.hidden_size3//2+1, 5),
                          )
    def forward(self, cont_x):
        loading_x = cont_x[:, :26]
        fnc_x = cont_x[:, 26:1404]
        img_x = cont_x[:, 1404:]
        loading_x = self.mlp1(loading_x)
        fnc_x = self.mlp2(fnc_x)
        img_x = self.mlp3(img_x)
        x