前面对SpaceNet进行调参,发现最高才89%,我的直觉告诉我还是低了点,为了证明,我决定调用常规的方法,如svm,logistics等,来验证这个分数。
上一个章节对SpaceNet进行cv=10的操作,准确率是-89%和86%,再验证集是62.5%。
SpaceNet模型接受的数据是3D的数据,而scikitlearn是2D数据,所以需要降维,即使用nilearn的NiftiMasker函数,Nifti Masker,这个函数是用来把三维数据变成二维数据的,如下图:
当然了,这个70831是用group mask屏蔽了brain bet之外的体素,值得注意的是,这个二维数组虽然可以用于scikitlearn,但是不能用于SpaceNet模型。
还有一点需要注意的是,SpaceNet本身是没有threshold的,但是没有这个就不能画AUC,其实是有办法的,就是SpaceNet有一个专门的函数是decision_function,它>0代表正类,它小于0代表负类,有了这个函数,就有了threshold,就可以画AUC了,很棒。这个是重点,记笔记。
那么SpaceNet的cv准确率只有89%和86%,test accuracy也只有62.5%,是不是数据就是这样子呢?下面就试试其他的model,需要注意的是,这里调用model以后,model有3个方法,fit、predict和transform。
初始的未经调参的model准确率也不高,只有0.5,下次试试调整参数,看能不能达到0.9以上。
(待补充)
(待补充)
(待补充)
(待补充)
(待补充)
等调整好参数,accuracy变成90%以上以后,使用inverse_transform把二维数据变成3D,同时输出weight图像:
值得一提的是,scikit-learn具有统一的API,model后面是coef_或者feature_importances_就能提取出权重并输出3D图像。
如此一来,所有问题都解决了,就差调参和找ROI了。
2021-11-24更新
这几天总是不能理解SpaceNet模型,调参也很不顺利,于是我重新阅读了原始文献,一共6篇,感悟如下:
(1)原文说放进模型的数据,最好是预处理后的,但是不要进行smooth和filter,否则就改变了原始数据值。
(2)模型输入的数据只能是3D的。1D是列表,2D是单个nii图像(nii图像其实是3维的,这里我算作2D),这样就组成了3D。因此这样就导致一个问题:
对于任务态功能磁共振,这个很简单,就是从time slice中调出与label相关的slice,这个slice就是2D的,然后多个time slice就组成了3D,然后time对应着label。
但是对于多个被试的静息态功能磁共振来说呢?这就无法实现。因为静息态数据,如果是不filter不smooth,它就是3D数据,2D图像,1D时间序列,所以再加上多个被试,那就是4D了,无法输入模型,所以这个时候模型会报错。
对于上述问题,有两种方法解决。
一个是使用指标图像,比如reho图,reho是单层2D图。但是问题在于,reho是一个指标,它丢失了原始数据,用它来找ROI,这个行为本身没有逻辑性和关联性,相应的alff和falff同理,因此这种方法虽然可以出结果,但是我个人不太认可,这个方法也能达到62.5%的准确率,但是还是偏低,原文献中的预测准确率达到了73%。
另一个就是使用VBM分析的方式,用 grey matters segmentation,这个nii图是2D的,它也是符合模型要求的,所以可以用它来找灰质上的ROI,然后通过ROI计算FC。