天天看点

(Pipeline用法)ValueError: Invalid parameter count_vec_binary for estimator Pipeline. Check.....

关于Pipeline的代码如下:

# 使用Pipeline搭建使用朴素贝叶斯模型的分类器,使用CountVectorizer对文本特征进行抽取
pip_count = Pipeline([
    ('count_vect', CountVectorizer(analyzer='word')),
    ('mnb', MultinomialNB())
])
 
# 配置用于模型超参数搜索的组合
params_count = {
    'count_vec_binary': [True, False],
    'count_vec_ngram_range': [(1, 1), (1, 2)],
    'mnb_alpha': [0.1, 1.0, 10.0]
}
 
if __name__ == '__main__':
    # 使用采用4折交叉验证的方法对使用CountVectorizer的朴素贝叶斯模型进行并行化超参数搜索
    gs_count = GridSearchCV(pip_count, params_count, cv=4, n_jobs=-1, verbose=1)
    gs_count.fit(X_train, y_train)
    # 输出交叉验证中最佳的准确性得分以及超参数组合
    print(gs_count.best_score_)
    print(gs_count.best_params_)      

错误信息如下:

ValueError: Invalid parameter count_vec_binary for estimator Pipeline. Check the list of available parameters with `estimator.get_params().keys

下面是Pipeline的原理用法,看完之后,对于如何解决这个bug就有方法了:

首先来看官网上对于Pipeline的介绍:

(Pipeline用法)ValueError: Invalid parameter count_vec_binary for estimator Pipeline. Check.....

即:

pipeline的目的:当设置不同的参数时可以组合几个交叉验证的步骤。可以使用它们的名字和属性参数来设置不同步骤的参数(需要在参数前面加__(两个下划线)来连接)。-- 参数集在数据集上的重复使用。

通过上面的介绍可知,我们在定义parameters的时候,需要在pipeline名字后面加"_",上面代码的错误之处就在于:

(1)在pip_count中定义了2个两个属性(count_vect,mnb),而在下面配置用于模型超参数搜索的组合时,参数名称为:count_vec_binary,count_vec_ngram_range,mnb_alpha,对于mnb_alpha这个是在mnb的属性的参数正确的,而对于count_vec_binary,count_vec_ngram_range这两个属性,定义是错误的,应该将其改为count_vect_binary,count_vect_ngram_range

(2)需要在参数前加“__”(2个下划线),因此需要将params_count中的count_vect_binary、count_vect_ngram_range、mnb_alpha改为count_vect__binary、count_vect__ngram_range、mnb__alpha。

即完整代码为:

# 使用Pipeline搭建使用朴素贝叶斯模型的分类器,使用CountVectorizer对文本特征进行抽取
pip_count = Pipeline([
    ('count_vect', CountVectorizer(analyzer='word')),
    ('mnb', MultinomialNB())
])
 
# 配置用于模型超参数搜索的组合
params_count = {
    'count_vect__binary': [True, False],
    'count_vect__ngram_range': [(1, 1), (1, 2)],
    'mnb__alpha': [0.1, 1.0, 10.0]
}
 
if __name__ == '__main__':
    # 使用采用4折交叉验证的方法对使用CountVectorizer的朴素贝叶斯模型进行并行化超参数搜索
    gs_count = GridSearchCV(pip_count, params_count, cv=4, n_jobs=-1, verbose=1)
    gs_count.fit(X_train, y_train)
    # 输出交叉验证中最佳的准确性得分以及超参数组合
    print(gs_count.best_score_)
    print(gs_count.best_params_)      

继续阅读