Я использую scickit-learn для настройки гипер-параметров модели. Я использую конвейер, чтобы иметь цепочку предварительной обработки с оценкой. Простая версия моей проблемы будет выглядеть так:
import numpy as np
from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
grid = GridSearchCV(make_pipeline(StandardScaler(), LogisticRegression()),
param_grid={'logisticregression__C': [0.1, 10.]},
cv=2,
refit=False)
_ = grid.fit(X=np.random.rand(10, 3),
y=np.random.randint(2, size=(10,)))
В моем случае предварительная обработка (что будет в StandardScale() в примере с игрушкой) занимает много времени, и я не настраиваю никаких параметров.
Итак, когда я выполняю этот пример, StandardScaler выполняется 12 раз. 2 подходят/предсказывают * 2 cv * 3 параметра. Но каждый раз, когда StandardScaler выполняется для другого значения параметра C, он возвращает тот же результат, поэтому было бы гораздо более эффективно вычислять его один раз, а затем просто запускать часть оценки конвейера.
Я могу вручную разделить конвейер между предварительной обработкой (не настроенными гипер-параметрами) и оценкой. Но чтобы применить предварительную обработку данных, я должен предоставить только набор тренировок. Таким образом, я должен был бы реализовать разрывы вручную, и вообще не использовать GridSearchCV.
Есть ли простой/стандартный способ избежать повторения предварительной обработки при использовании GridSearchCV?