Как создать конвейер с несколькими входами?

#python #scikit-learn #pipeline #nilearn

#python #scikit-learn #конвейер #nilearn

Вопрос:

Я хочу применить выделение объектов с помощью двоичной маски. Двоичная маска создается с использованием файла шаблона и порогового значения, так что единицы и нули в файле маски соответствуют значениям в объекте шаблона выше или ниже этого порогового значения. На следующем шаге я хочу использовать эту маску, чтобы «вырезать» объекты в наборе данных и передать это подмножество выбора объектов другим следующим этапам конвейера. Как процедура построения маски, так и процедура предварительной обработки работают с аргументами ключевых слов (например, с пороговым значением, которое я только что упомянул), которые можно рассматривать как гиперпараметры и, следовательно, оптимизировать с помощью вложенной перекрестной проверки. Как я могу (или лучше, если это возможно) реализовать как оптимизацию процедуры построения маски, так и следующие шаги конвейера в одном конвейере?

Вот пример использования набора данных oasis от nilearn:

Допустим, у меня есть файл nifti с именем template , который служит шаблоном для двоичной маски. У меня также есть МРТ серого вещества -изображения 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)