返回列表

30th place solution - and some thoughts

388. TReNDS Neuroimaging | trends-assessment-prediction

开始: 2020-04-23 结束: 2020-06-29 医学影像分析 数据算法赛
第30名解决方案 - 以及一些思考

第30名解决方案 - 以及一些思考

作者: srs | 排名: 第30名

首先感谢组织者举办了这场充满挑战且有趣的比赛!

我在比赛中看到了许多优秀、撰写精良且开发完善的解决方案……我的方案并不在此列。但我只是想在这个较晚的阶段参与一下,因为我可能使用了一些未被广泛采用的特征工程方法。遗憾的是,我现在没有时间深入详述,但我会给你们一个关于我所做工作的粗略描述。

反思

关于我对这次挑战的个人看法。看到这次挑战时我非常兴奋,这应该属于我的专业领域,所以何不试一试呢。于是我做了,写了一个在我看来还算成功的EDA(探索性数据分析)笔记本,深入了解了数据,不知怎么地排到了第13名。但是,正如人们所指出的,在讨论等方面并没有太多动静,所以我可能对自己的位置有点自满,没有做太多进一步的开发。此外,我可能也有点恼火,因为我无法如愿解决 domain1_var1domain2 变量上的误差问题。

然后生活琐事接踵而至,休假、截止日期、一场在线黑客马拉松。没有太多时间留给比赛,突然间只剩下10天了,我面临着一个截止日期,发现自己在排行榜上掉到了第50名左右。于是有些恐慌,甚至有些疯狂,我从头重写了分析和预处理,运行了所有不同的模型。把它们堆叠起来,突然间变成了第34名,并在私有排行榜上达到了第30名——这是我迄今为止最好的比赛成绩。

预处理与特征

目标变量

  1. 我决定对我的数据进行分层交叉验证,所以我在目标变量上使用了 KNN(n_clusters=15),将缺失值设置为0,以便在分层方法中考虑到这一点。
  2. 然后我使用 sklearn.impute.IterativeImputer 来填补缺失数据。对我来说,这似乎是在丢弃数据和填充常数之间的一个很好的平衡。然而,之后我并没有真正去检查填补的效果……

预处理与特征工程

  • loading.csv - 丢弃了 IC_20 - 这个特征在训练集和测试集之间似乎差异很大(参考讨论区和Kernels)。
  • fnc.csv - 重新排序数据以便配合 nilearn.connectome.vec_to_sym_matrix 使用。
  • 从4D特征图中提取数据。我有一个Kernel展示了如何使用 nilearn.input_data 中的不同 Masker 对象来完成这一步。我在这里提取了 schaeffer(400个脑区)、msdlbasc(197个脑区)这几个数据集。
  • 基于图的特征:几篇出版物也专注于使用基于图论的功能连接描述作为机器学习分类器的特征。所以我使用了“脑连接工具箱”,即 bct.py 来推导特征。这只是一大堆全局和局部的描述,也包括在不同阈值下的连接矩阵(源自 fnc)。总共约1700个特征(有时会有非常糟糕的数值问题),我在堆叠数据之前的预处理中以某种方式解决了这些问题。这被命名为 fnc_graph
  • 组合数据,我还创建了 loadfnc 集,结合了 fncloading 数据,以及 loadmsdl 结合了 msdlloading。最后,我还使用了一个 loadnoise 集,我在其中向 loading 数据添加了一些随机截距和高斯噪声(每个子集不同)。这是否有帮助,很遗憾我无法测试。

堆叠,堆叠,堆叠

我堆叠了大量的模型(每个特征32个),使用了不同的回归方法,有时也使用不同的预处理。ConnectivityMeasure(缩写为 CM)是 nilearn.connectome 中的一个类,可用于将 n x t 矩阵转换为 n x n 连接矩阵,使用不同类型的连接方式。好处是,它也适合sklearn管道,因为矩阵的向量化版本是可行的。

数据集 预处理 (SVR, LGBM) 预处理 (回归)
basc CM(tangent), PCA(whiten=True), RobustScaler() CM(correlation), PCA(whiten=True)
msdl CM(tangent), PCA(whiten=True), RobustScaler() CM(correlation), PCA(whiten=True)
schaeffer CM(tangent), PCA(whiten=True), RobustScaler() CM(correlation), PCA(whiten=True)
fnc PCA(whiten=True) abs(fnc) < 0.15 = 0, PCA(whiten=True)
fnc_pca