我希望在sklearn中构建一个Pipeline,并使用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)
我认为这会奏效,我只需创建一个投影对象并将其传递给Pipeline,使用评估器名称作为其参数。
但对我而言,这种方式有些混乱且不可扩展:每次想比较不同模型时,都需要定义新的类。另外,为了继续这个解决方案,可以实现一个执行相同工作但具有任意一组模型的类。这对我来说似乎过于复杂。
什么是比较不同模型最自然和Pythonic的方法?