#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)