Я хочу построить конвейер в sklearn и протестировать различные модели с помощью GridSearchCV.
Просто пример (не обращайте внимания на то, какие именно модели выбраны):
reg = LogisticRegression()
proj1 = PCA(n_components=2)
proj2 = MDS()
proj3 = TSNE()
pipe = [('proj', proj1), ('reg' , reg)]
pipe = Pipeline(pipe)
param_grid = {
'reg__c': [0.01, 0.1, 1],
}
clf = GridSearchCV(pipe, param_grid = param_grid)
Здесь, если я хочу попробовать разные модели для уменьшения размерности, мне нужно кодировать разные конвейеры и сравнивать их вручную. Есть ли простой способ сделать это?
Одно решение, которое я придумал, - это определить мой собственный класс, полученный из базовой оценки:
class Projection(BaseEstimator):
def __init__(self, est_name):
if est_name == "MDS":
self.model = MDS()
...
...
def fit_transform(self, X):
return self.model.fit_transform(X)
Я думаю, что это сработает, я просто создаю объект Projection и передаю его в Pipeline, используя имена оценщиков в качестве параметров для него.
Но для меня этот способ немного хаотичен и не масштабируем: он заставляет меня определять новый класс каждый раз, когда я хочу сравнить разные модели. Также, чтобы продолжить это решение, можно реализовать класс, который выполняет ту же работу, но с произвольным набором моделей. Это кажется мне слишком сложным.
Какой самый естественный и питонный способ сравнения разных моделей?