最近两个月在做一个预测自闭症的项目(https://github.com/ramp-kits/autism),提供的数据有被试的年龄,性别,用freesurfer提取的结构像数据,不同模板提取的resting-state的数据。类似于kaggle,有Public的datasets,大概1000多被试供参与者建立自己的模型,另外差不多也是1000多人的private的数据用来进行测试和排名。相比于kaggle, ramp这个平台知名度比较小,所以参加的人并不多。奖金个人觉得还是比较丰厚的,相对于参与人数来说。第一名E3000,第二名E2000,第三名E1000,第四到第十都是E500。刚开始参加的时候,觉得懂数据的人不一定了解脑科学,懂脑科学的人不一定会搞机器学习和预测,如果即懂数据分析,又懂脑科学的人成绩应该不会太差,所以就欣然上路了。。。直到kaggle最近发布了一个把所有特征匿名的比赛,才发现这一个误解,真正的数据科学家是不需要太多背景知识也可以搞定数据的。
未来的趋势
相比修改自己无聊透顶的文章来说(Btw, 我做个研究是一个大样本fMRI扫雷式的研究,以后有机会再吐槽),这个预测的项目充满了挑战,它诠释了you can you up/是骡子是马拉出来溜溜的实用主义。心理学(认知神经科学)中,p-hacking,数据分析中mistake, 小样本的bias,还有统计方法(比如假设检验)都是造成结果无法被重复的原因。另外一个方面,即使在使用机器学习方法进行预测的研究中,有很大一部分研究使用了相对较少的样本,样本数据来自同一个scanner,或者使用了leave-one-out的交叉检验,此外这类研究根本无法防止研究者overfit自己的数据,这些都可能造成结果的可重复性差。这个自闭症预测比赛的可贵之处在于,有1000+未知的数据可以用来检验模型的表现。 这类比赛可能是防止研究者自己overfit自己数据的最有效方法,可能成为以后的趋势。【overfit是指根据数据A选最好的特征和模型及参数,然后放到同质的数据B上,模型表现极差,模型毫无意义】
分享几点感受:
1. 自己从未从导师的角度出发思考过这个问题,跟导师谈过这个竞赛,他说这样做比招博后省钱。确实如此一个博后一个月E2200+,做个两三年不一定产出个好的模型,而且搞不好自己在overfit自己的数据。【好吧,算是给别人做了两个月不拿工资的博后。。。导师以为我在专心修改论文】。
2. OOP才是python精华
碰到的第一个问题就是python的oop(面向对象编程),之前用python都是按照matlab的套路用的,spyder打开后python完全就是另外一个版本的matlab。 几乎所有的sklearn的内容全部都是按照oop的方式编写的,这样给调用提供了很大的便利。在过程中感受到的oop的强大之处。
3. 本专业的知识没用上多少
唯一用到的相关知识是,motion的correction,看综述,使用了自己觉得正确的方法,矫正了头动+1st derivative+RMS,用correlation作为FC。 小世界,低频振幅等rest常用的属性尝试过,但没时间去探索。对于功能连接只是用index表示,比如FC_01, FC_02,具体哪跟哪连接的也没有map到脑上看。如果有宽裕的时间的话,我应该会把具有区分度的fc画出来,结合所在脑区进行特征选择【这是心理学背景的人会想去做的事情,当然这样可能导致严重的overfitting】。
4. 基于自己的模型和数据来看,power 2011的模板比其他几个模板效果要好一点。Shen atlas 组织者没有提供,但是也是值得考察的一个模板。
最后的结果
public leaderboard 8
private leaderboard 大概30+
一个星期才缓过神。好吧,对特征的hardcoding是overfitting的元凶。值得一提的是public leaderboard上前10几乎都用了hardcoding,而且居然有人达到了0.99的AUC,之前还一直以为是大神用了不寻常model,心里非常膜拜。【Hardcoding就是使用各种手段,把认为最好的特征直接告诉你的算法。比如特征提取完了,你基于某些标准直接选第1,3,5,6,22..个特征作为模型的输入】最好的方法是将特征选择嵌入到算法中,所谓nested cross-validation。
在特征选择时,效应量是我使用的标准之一,虽然从机器学习的角度看,使用效应量可能让y label leaking,从增加了overfitting的风险,但按照心理学研究的逻辑,使用效应量选择两组间有差异的特征(FC),那么这些差异在另外同质的样本上应该也是显著差异的。比如从public的数据中,我发现了自闭症和正常被试的IFG和SMA的FC有显著差异(n=1000+), 那么对于private的数据,这种差异应该是依然存在的。但事实证明,这样做效果真的很差。这不得不让我重新审视这一逻辑,心理学研究可重复性到底有多少,效应/结论推广到更大的样本或者其他同质样本上是否还会存在?
无力吐槽的top10
真正让人无力吐槽的是前10的代码。自己对前10代码的期待是:
有对数据特点的考量,有特别的去头动矫正的方法
有高级的算法,比如深度学习,xgboost, 贝叶斯的应用
有除了FC新的特征,比如ALFF 小世界属性
事实是,前10的代码没有太多高明之处,一度让我怀疑自己对待这个活动太过认真,简单的有可能是最有效的。有人直接使用了组织者提供的代码,将所有可用的altlas提取的FC,stack一下;几乎没有人回归头动,更不要说RMS和1st derivative了;几乎所有代码都是组织者提供的代码稍作修改提交的,因此大部分人都用了默认的covariance而不是correlation作为FC;几乎都是清一色logistic regression, 甚至elastic net都没看到。估计组织者在看到top 10的代码时会比较失望。如果把比赛放在kaggle上,可能会有更好的效果。自己没有比较过矫正头动和不矫正头动的差别,也没有比较covariance和correlation定义FC的差别,但是如果模型表现好应该有其理由。
最后的最后
个人觉得在比赛进行一半的时候,公布一次private leaderboard是比较好的,这样可以提醒一大部分人他们是在overfitting。另外一个细思极恐的事实是在用机器学习的方法进行研究,发论文时,无论使用了怎么样的cross-validation的方法和花哨的模型,自己overfit自己的数据根本无法避免。如果一篇文章声称用了某些指标(比如 vbm, cortical thickness, rest的fc, 等)成功预测了某个结果(比如自闭症,ADHD, 某个量表的得分,等),方法的可行性,读者需要有自己的判断 ( with big caution) 。此外,此类方法的一大挑战是可解释性,简单的例子就是神经网络,RNN/CNN 广泛运用在图像识别,自然语言处理上,只看重结果,不需要解释,但如果用在脑科学的研究上,节点几乎无法解释,使用这种方法的意义不大。
原创文章,转载请注明