赞
踩
DTI数据竞赛经验总结(高维小样本特征处理)
首先说这次比赛是我第一次正式打数据竞赛,结果比较扯,名次不好,模型过拟合很严重。写这篇文章主要是两个目的:一个是记录一下比赛中总结的一些经验和教训,另一个是总结一下高维特征降维的方法。
比赛是基于多中心DTI影像的阿尔茨海默病分类竞赛,赛事介绍链接在此:https://mp.weixin.qq.com/s/KlJOOvwqXkD1ANoVG2AOuw。
弥散磁共振影像(DTI)在阿尔茨海默病(Alzheimer's disease, AD)中应用广泛,从DTI影像中提取扩散参数可以用来描述白质结构的完整性,进而显示AD中脑白质的退化模式。前期大量研究表明,使用基于DTI的白质指标,利用机器学习的方法可以比较有效的对AD进行诊断和分类。但是以往的绝大部分研究是基于单中心的有放回的交叉验证方法来评估分类的有效性,分类特征和方法的泛化性能有待进一步验证。为此,本项目旨在以18条主要的脑白质纤维束的扩散指标作为特征,建立并评估出对AD和健康人群(normal controls,NC)进行分类的最优机器学习模型。我们的首要目标是在交叉验证中和不同站点的数据集中获得较高且较为稳定的精度,在此基础上,进一步探索白质扩散信号对于轻度认知损害患者(mild cognitive impairment, MCI)的预测性能,即在AD、NC、MCI三分类中的性能表现。
项目提供的特征数据是由自动纤维束量化工具 (Automated Fiber Quantification, AFQ) (1, 2)处理得到的沿18条脑内主要纤维束上100个点的8种不同的指标,包括FA、MD、RD、AD,线性度、曲率、挠率和体积。目前数据集共包含825个被试,其中,我们向参赛者提供700例被试的数据用以训练模型,剩下的125例被试(不含标签)将在11月15日左右提供给大家用于模型测试。简单来说,该项目的任务就是使用提供的特征对AD和NC进行分类,参赛者可以自己进一步处理这些数据,例如特征提取、降维、平滑等等,并可以自由区分训练集和验证集,目标是获得更高的精度。评估标准:测试数据分类准确率,AUC和F_Score三个指标。排序顺序为1)正常人和AD的二分类性能;2)正常人,MCI和AD的三分类性能。所有模型先看二分类情况,如果得分相同,则继续参考三分类结果。正确率高者获胜。
所有由AFQ处理出的原始数据储存在MCAD_AFQ_competition.mat文件中,其中所有的矩阵中每一行代表一个被试的信息,所有矩阵的同一行都是匹配于同一个被试的。当数据加载成功时(以Matlab为例),以下矩阵将会出现:
根据提供的mat文件,首先通过MATLAB对该文件进行读取,分别将FA、MD、RD、AD,线性度、曲率、挠率、体积、sites、population和label存储为独立的11个csv文件,每个文件都是以行为样本,列为特征的格式进行存储,这样可以方面后续单独查看每种类型的特征。然后使用pandas按照一般的csv文件进行读取即可。
此次发放的训练集数据有700个样本,其中235个阿尔兹海默症患者(AD, label=1),215个轻度认知损害患者(MCI, label=2)和250个健康人(NC, label=3)。特征数量方面,有8种类型DTI数据处理得到的特征,具体如赛事介绍中所说:自动纤维束量化工具处理得到的沿18条脑内主要纤维束上100个点的8种不同的指标。因此每个指标就应该是1800个特征,不过主办方实际提供了20条脑内纤维束,只是原始有2条效果不好,不推荐加进模型,但是数据中是提供了,因此原始数据中每个指标应该是2000个特征。我在这里选择了主办方的建议,将2条效果不好的纤维束在预处理阶段直接剔除,因此每个指标实际上还是1800个特征。除去这8种指标得到的特征,还有population包含的age和sex特征、site特征。age和sex很好理解,不用多说。site就是不同机器或者不同地点采集得到的DTI数据,MRI数据存在的一个问题是模型对一个site的样本拟合的很好,可能对其他site的样本却效果不佳。这批数据是7个site,我主要是用它们进行分离数据,不作为分类特征加进特征矩阵中,在正式处理数据之前首先要将全部样本按照site分成7分,每一份单独分离训练集和测试集,然后再将每个site的训练集和测试集进行合并得到最终处理的训练集和测试集,并且在每一次分离训练集和测试集之前都对样本顺序进行打乱来确保模型稳定性,不过也正是因为打乱数据却没有仔细检查流程,导致模型最终过拟合比较严重,这个后面再说。
这样,我们这次的特征数量就是1800×8 + 2 + 1 = 14403个特征。
在进行降维之前,首先要对特征进行缺失值处理、标准化等操作。我之前看过其他数据竞赛经验,例如标准化这类操作也是存在将测试集数据信息泄露到训练集的问题,因此在标准化之前就要先分离训练集和测试集,然后再将训练集的均值和标准差作为测试集标准化的参数。我在这里采用了Scikit-learn库中的StandardScaler函数,先试用fit对训练集数据进行拟合,然后再用相同的实例对训练集和测试集进行transform,这样就完成了基于训练集数据均值和标准差对测试集的标准化步骤。
特征选择方法大致可以分为filter(过滤法),wrapper(包裹法)和embedding(嵌入法)。
过滤法包括:
可以通过sklearn的函数chi2来进行卡方检验;
此外,MRI数据生成的特征通常也会使用T检验、U检验等统计方法进行初步特征选择,但是我不是很清楚这两种方法是否可以划分到filter法中。具体办法就是比较不同label之间的p值,然后规定一个阈值并将该大于该阈值的特征全部剔除。在进行T检验和U检验时为了排除偏离个别样本可能带来的误差,可以选择留一法T/U检验,即进行和样本个数相同次数的循环,每次都按顺序去掉一个样本,然后计算其余样本不同群体之间的p值并进行特征剔除,循环结束后选择被保留次数最多的那部分特征。
包裹法,也就是递归特征消除法,使用一个目标模型来进行多轮训练,每轮训练都会消除多个权值系数的特征(每轮消除的数量需要自己设定)。完成一定循环次数后就会得到最佳特征子集。这里可以使用sklearn中的RFE函数进行,使用时需要规定一个基模型estimator,选择每轮循环消除的特征数量和最终保留的特征数量即可。在规定好分类器后该方法是较为有效的方法,毕竟是根据分类结果来消除特征,但是确定是需要多次拟合模型,特征选择速度非常慢,尤其是本次比赛这种高维数据。
嵌入法是MRI数据特征选择中比较常用的一种,分为基于惩罚项的特征选择方法和基于树模型的特征选择方法。
降维方法常见的有无监督的PCA方法和有监督的LDA方法,PCA会让映射后的样本具有最大发散性,LDA则是让样本具有最好的分类性能,本质都是让原始样本映射到更低维特征空间上。LDA在使用时n_components的数量必须小于类别数-1,所以对这次的数据n_components只能是1。此外,也可以使用t-SNE方法对讲特征降到二维或三维以利于可视化。
不过对于MRI数据降维,由于可解释性的原因,一般都使用filter, wrapper和embedding方法,这样可以确保原始特征不被破坏,有助于医学领域中生物标志物的解释。
按照往常科研的经验,在进行LASSO之前先进行filter整体效果会更好,所以这次我第一步处理就是每种filter方法都和LASSO, PCA构建pipeline模型结合一次看分类效果,但是结果比较差,比主办方给的baseline差很多。多次尝试之后我直接用LASSO先将特征降到几十维,然后再用PCA进行降维,发现效果出奇的好。LASSO和PCA的超参数搜索这里用了网格搜索法,找到了PCA的最佳n_components数是10。其实我自己也不是很清楚LASSO之后再接一个PCA是否合理,但是在比赛过程中发现LASSO后特征数量在50到60区间内分类准确率是最高的,直接降到10会很差,所以我就干脆将两个模型先一起用了。
Filter法我觉得在每种类型的特征数量差距比较大的时候适用,比如使用AAL模板处理结果中,ALFF, ReHo等特征只有116个,而FC却会有6670个,这种情况下先试用统计方法对FC单独进行一次特征选择,将其特征数量降到和其他特征相近的数量,统一拼接起来共LASSO或RFE等方法做进一步处理。
RFE和基于GBDT的特征选择也都试过,但是效果和LASSO差别不大,尤其是RFE进行特征选择时耗费时间极长,鉴于比赛自己调试模型时间并不是特别长,试过一次发现效果一般时就没有继续调参数了,选择了LASSO这种又快又好用的模型进行特征选择。
相关领域文章中常用的有支持向量机,随机森林等,结合特征选择后一般分类效果都可以满足需求,不过数据比赛中往往都会对多个模型进行集成。这次因为每支队伍最多可以提交5个模型,所以集成模型中的voting法和stacking法都各自提交了一份,集成的基模型是支持向量机,随机森林,多层感知机,XGBoost和LightGBM,超参数是每种模型向各自使用网格搜索法进行最优参数搜索,再将最优参数模型统一进行集成。这里的全部模型除了XGBoost和LightGBM都能通过sklearn实现。
过拟合的原因:主要是自己构建模型时,测试集信息就应该泄露到训练集了。我在训练集和测试集划分时首先进行的是样本顺序打乱,结果某一次LASSO得到的特征我发现准确率相对高些,就直接将这批特征序号保存,之后不进行LASSO,直接用这批特征进行PCA和分类。这样,由于每次运行之前还是首先会对样本进行打乱,就导致了测试集中的样本在之前那次LASSO中出现过,也就是信息泄露,这就导致了我的分类结果虚高,训练集上的准确率达到了将近90%,但是主办方返回的测试集准确率只有71%。
[1] https://www.zhihu.com/question/28641663/answer/1168801008
[2] https://www.zhihu.com/question/324745054
[3] https://blog.csdn.net/qq_33876194/article/details/88403394
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。