我想通过使用二进制掩码来应用特征选择。通过使用模板文件和阈值来创建二进制掩码,以便掩码文件中的1和0与该阈值之上或之下的模板对象中的值相对应。在下一步中,我想使用此蒙版“剪切”数据集中的特征,并将该特征选择子集传递给其他后续管道步骤。掩码构建过程和预处理过程都可以使用关键字参数(例如我刚刚提到的阈值)来工作,这些关键字参数可以视为超参数,因此可以通过嵌套交叉验证进行优化。我如何(或者更好地)在一个管道中实现蒙版构建过程的优化和以下管道步骤?
下面是使用nilearn的绿洲数据集的示例:
假设我有一个名为template
的nifti文件,它用作二进制掩码的模板。我也有30个主题(特征)及其年龄(标签)的灰质mri图像:
import numpy as np
from nilearn import datasets
from sklearn.svm import SVC
from nilearn.input_data import NiftiMasker
from sklearn.preprocessing import Binarizer
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import cross_val_score
from sklearn.pipeline import Pipeline
from nilearn import image
n_subjects = 30
############################################################################
# load template file which serves as mask
template = image.load_img("./template.nii.gz").get_data()
# load oasis dataset
oasis_dataset = datasets.fetch_oasis_vbm(n_subjects=n_subjects)
# load features
X = oasis_dataset.gray_matter_maps
# load labels
age = oasis_dataset.ext_vars['age'].astype(float)
该管道应该同时使用模板和要素作为输入。然后,应用嵌套交叉验证来找到最佳超参数。管道必须包含切割函数mask_cutter
,该切割函数将蒙版和要素同时作为输入并返回原始数据集的要素子集。在此示例中,set_mask
的阈值和svc
的C参数均应进行优化(请注意,以下部分不适用于 伪代码 ):
# Set up possible values of parameters to optimize over
p_grid = {
"mask__threshold": np.array([1,2,3]),
"svc__C": np.array([4,5,6])
}
# Binarizer to create binary mask using template
set_mask = Binarizer()
# NiftiMasker to cut out features from X using binary mask
mask_cutter = NiftiMasker()
# Use Support Vector Classification Algorithm
svc = SVC(kernel='linear')
# create pipeline
mask_svc = Pipeline([
('mask',set_mask),
('cut',mask_cutter),
('svc', svc)
])
###########################################################################
grid = GridSearchCV(mask_svc, param_grid=p_grid, cv=3)
nested_cv_scores = cross_val_score(grid, X, age, cv=3)