python – 在Gridline for GridSearchCV中替换不同的模型
作者:互联网
我想在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,使用估算器的名称作为参数.
但对我来说,这种方式有点乱,不可扩展:每次我想比较不同的模型时,我都会定义新类.另外,为了继续这个解决方案,可以实现一个执行相同工作但具有任意模型集的类.这对我来说似乎过于复杂.
比较不同模型的最自然和pythonic方法是什么?
解决方法:
让我们假设你想使用PCA和TruncatedSVD作为你的硬币减少步骤.
pca = decomposition.PCA()
svd = decomposition.TruncatedSVD()
svm = SVC()
n_components = [20, 40, 64]
你可以这样做:
pipe = Pipeline(steps=[('reduction', pca), ('svm', svm)])
# Change params_grid -> Instead of dict, make it a list of dict
# In the first element, pass parameters related to pca, and in second related to svd
params_grid = [{
'svm__C': [1, 10, 100, 1000],
'svm__kernel': ['linear', 'rbf'],
'svm__gamma': [0.001, 0.0001],
'reduction':pca,
'reduction__n_components': n_components,
},
{
'svm__C': [1, 10, 100, 1000],
'svm__kernel': ['linear', 'rbf'],
'svm__gamma': [0.001, 0.0001],
'reduction':svd,
'reduction__n_components': n_components,
'reduction__algorithm':['randomized']
}]
现在只需将管道对象传递给gridsearchCV
grd = GridSearchCV(pipe, param_grid = params_grid)
调用grd.fit()将在params_grid列表的两个元素上搜索参数,一次使用一个值.
请查看我的其他答案以获取更多详细信息:“Parallel” pipeline to get best model using gridsearch
标签:cross-validation,pipeline,grid-search,python,scikit-learn 来源: https://codeday.me/bug/20190724/1521568.html