【发布时间】:2018-10-20 07:36:12
【问题描述】:
我想在 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)
我认为它会起作用,我只是创建一个 Projection 对象并将其传递给 Pipeline,使用估计器的名称作为它的参数。
但对我来说,这种方式有点混乱且不可扩展:每次我想比较不同的模型时,它都会让我定义新的类。同样为了继续这个解决方案,人们可以实现一个做同样工作的类,但使用任意一组模型。这对我来说似乎过于复杂了。
比较不同模型最自然、最符合 Python 的方法是什么?
【问题讨论】:
-
您可以直接使用估算器作为参数。
标签: python scikit-learn pipeline cross-validation grid-search