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

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

Вот пример использования набора данных оазиса 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)

0 ответов

Другие вопросы по тегам