Я хочу построить конвейер в 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, используя имена оценщиков в качестве параметров для него.
Но для меня этот способ немного хаотичен и не масштабируется: он заставляет меня определять новый класс каждый раз, когда я хочу сравнить разные модели. Также, чтобы продолжить это решение, можно реализовать класс, который выполняет ту же работу, но с произвольным набором моделей. Мне это кажется слишком сложным.
Какой самый естественный и питонический способ сравнения разных моделей?