关于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的目的:当设置不同的参数时可以组合几个交叉验证的步骤。可以使用它们的名字和属性参数来设置不同步骤的参数(需要在参数前面加__(两个下划线)来连接)。-- 参数集在数据集上的重复使用。
通过上面的介绍可知,我们在定义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_)