Как создать конвейер с несколькими входами?
Я хочу применить выбор функции с помощью двоичной маски. Двоичная маска создается с использованием файла шаблона и порога, чтобы нули и нули в файле маски соответствовали значениям в объекте шаблона выше или ниже этого порога. На следующем шаге я хочу использовать эту маску, чтобы "вырезать" объекты в наборе данных и передать это подмножество выбора объектов на другие последующие шаги конвейера. Как процедура построения маски, так и процедура предварительной обработки работают с аргументами ключевых слов (например, пороговым значением, которое я только что упомянул), который можно рассматривать как гиперпараметры и, таким образом, можно оптимизировать с помощью вложенной перекрестной проверки. Как я могу (или, что лучше, возможно) реализовать как оптимизацию процедуры построения маски, так и следующие шаги конвейера в одном конвейере?
Вот пример использования набора данных оазиса nilearn:
Допустим, у меня есть файл NIFTI с именем template
который служит шаблоном для двоичной маски. У меня также есть mri-изображения серого вещества из 30 предметов (особенности) и их возраста (ярлыки):
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
и параметр C для svc
следует оптимизировать (обратите внимание, что в следующем разделе не работает псевдокод):
# 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)