sklearn 估计器管道的参数无效
Invalid parameter for sklearn estimator pipeline
我正在使用 Python 2.7 和 sklearn 0.16 实现 O'Reilly 书中的示例“Python 机器学习简介”。
我使用的代码:
pipe = make_pipeline(TfidfVectorizer(), LogisticRegression())
param_grid = {"logisticregression_C": [0.001, 0.01, 0.1, 1, 10, 100], "tfidfvectorizer_ngram_range": [(1,1), (1,2), (1,3)]}
grid = GridSearchCV(pipe, param_grid, cv=5)
grid.fit(X_train, y_train)
print("Best cross-validation score: {:.2f}".format(grid.best_score_))
返回的错误归结为:
ValueError: Invalid parameter logisticregression_C for estimator Pipeline
这是与使用 v.0.16 中的 Make_pipeline 有关的错误吗?是什么导致了这个错误?
在Pipeline中估计器名称和它的参数之间应该有两个下划线
logisticregression__C
。对 tfidfvectorizer
做同样的事情
中的示例
请注意,如果您使用带有投票分类器和列选择器的管道,您将需要多层名称:
pipe1 = make_pipeline(ColumnSelector(cols=(0, 1)),
LogisticRegression())
pipe2 = make_pipeline(ColumnSelector(cols=(1, 2, 3)),
SVC())
votingClassifier = VotingClassifier(estimators=[
('p1', pipe1), ('p2', pipe2)])
您将需要一个如下所示的参数网格:
param_grid = {
'p2__svc__kernel': ['rbf', 'poly'],
'p2__svc__gamma': ['scale', 'auto'],
}
p2
是管道的名称,svc
是您在该管道中创建的分类器的默认名称。第三个元素是你要修改的参数。
对于在 GridSearchCV
中使用 Pipeline
的更一般的答案,模型的参数网格应以您在定义管道时提供的任何名称开头。例如:
# Pay attention to the name of the second step, i. e. 'model'
pipeline = Pipeline(steps=[
('preprocess', preprocess),
('model', Lasso())
])
# Define the parameter grid to be used in GridSearch
param_grid = {'model__alpha': np.arange(0, 1, 0.05)}
search = GridSearchCV(pipeline, param_grid)
search.fit(X_train, y_train)
在管道中,我们将名称 model
用于估算器步骤。因此,在网格搜索中,Lasso 回归的任何超参数都应以前缀 model__
给出。网格中的参数取决于您在管道中给出的名称。在没有管道的普通旧 GridSearchCV
中,网格将像这样给出:
param_grid = {'alpha': np.arange(0, 1, 0.05)}
search = GridSearchCV(Lasso(), param_grid)
您可以从这里了解更多关于 GridSearch 的信息 post。
您始终可以使用 model.get_params().keys()
[如果您仅使用模型] 或 pipeline.get_params().keys()
[如果您使用管道] 来获取您可以调整的参数的键。
我正在使用 Python 2.7 和 sklearn 0.16 实现 O'Reilly 书中的示例“Python 机器学习简介”。
我使用的代码:
pipe = make_pipeline(TfidfVectorizer(), LogisticRegression())
param_grid = {"logisticregression_C": [0.001, 0.01, 0.1, 1, 10, 100], "tfidfvectorizer_ngram_range": [(1,1), (1,2), (1,3)]}
grid = GridSearchCV(pipe, param_grid, cv=5)
grid.fit(X_train, y_train)
print("Best cross-validation score: {:.2f}".format(grid.best_score_))
返回的错误归结为:
ValueError: Invalid parameter logisticregression_C for estimator Pipeline
这是与使用 v.0.16 中的 Make_pipeline 有关的错误吗?是什么导致了这个错误?
在Pipeline中估计器名称和它的参数之间应该有两个下划线
logisticregression__C
。对 tfidfvectorizer
请注意,如果您使用带有投票分类器和列选择器的管道,您将需要多层名称:
pipe1 = make_pipeline(ColumnSelector(cols=(0, 1)),
LogisticRegression())
pipe2 = make_pipeline(ColumnSelector(cols=(1, 2, 3)),
SVC())
votingClassifier = VotingClassifier(estimators=[
('p1', pipe1), ('p2', pipe2)])
您将需要一个如下所示的参数网格:
param_grid = {
'p2__svc__kernel': ['rbf', 'poly'],
'p2__svc__gamma': ['scale', 'auto'],
}
p2
是管道的名称,svc
是您在该管道中创建的分类器的默认名称。第三个元素是你要修改的参数。
对于在 GridSearchCV
中使用 Pipeline
的更一般的答案,模型的参数网格应以您在定义管道时提供的任何名称开头。例如:
# Pay attention to the name of the second step, i. e. 'model'
pipeline = Pipeline(steps=[
('preprocess', preprocess),
('model', Lasso())
])
# Define the parameter grid to be used in GridSearch
param_grid = {'model__alpha': np.arange(0, 1, 0.05)}
search = GridSearchCV(pipeline, param_grid)
search.fit(X_train, y_train)
在管道中,我们将名称 model
用于估算器步骤。因此,在网格搜索中,Lasso 回归的任何超参数都应以前缀 model__
给出。网格中的参数取决于您在管道中给出的名称。在没有管道的普通旧 GridSearchCV
中,网格将像这样给出:
param_grid = {'alpha': np.arange(0, 1, 0.05)}
search = GridSearchCV(Lasso(), param_grid)
您可以从这里了解更多关于 GridSearch 的信息 post。
您始终可以使用 model.get_params().keys()
[如果您仅使用模型] 或 pipeline.get_params().keys()
[如果您使用管道] 来获取您可以调整的参数的键。