在 Pipeline 上进行网格搜索后更新变压器参数

Posted

技术标签:

【中文标题】在 Pipeline 上进行网格搜索后更新变压器参数【英文标题】:Updating transformer parameters after grid search on Pipeline 【发布时间】:2017-02-26 19:03:57 【问题描述】:

我有一个用于文本分析和分类的简单管道,包括一个 CountVectorizer、一个 TfidfTransformer,最后是一个多项式朴素贝叶斯分类器。

from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer
from sklearn.naive_bayes import MultinomialNB
from sklearn.pipeline import Pipeline

text_clf = Pipeline([('vect', CountVectorizer()),
                 ('tfidf', TfidfTransformer()),
                 ('clf', MultinomialNB())])

我现在使用 GridSearchCV 确定最佳参数(stop_words 包含先前加载的停用词列表):

from sklearn.model_selection import GridSearchCV

parameters = 'vect__ngram_range': [(1,1), (1,2), (1,3)],
          'vect__stop_words': [None, stop_words],
          'tfidf__use_idf': [True, False],
          'clf__alpha': np.arange(0.0, 1.05, 0.05)


grid_clf = GridSearchCV(text_clf, parameters, n_jobs = 1)
_ = grid_clf.fit(X_train, y_train)

我现在可以使用grid_clf.best_params_查看模型的最佳参数:

'clf__alpha': 0.050000000000000003,
'tfidf__use_idf': True,
'vect__ngram_range': (1, 3),
'vect__stop_words': None

我的问题是:如何使用网格搜索返回的最佳参数取回更新的管道?我希望能够使用适当的参数调用管道的前两个步骤(CountVectorizer 和 TfidfTransformer)。

我发现的一种解决方法是使用网格搜索返回的最佳参数显式创建一个新管道:

multinomial_clf = Pipeline([('vect', CountVectorizer(stop_words=None, ngram_range=(1,3))),
                 ('tfidf', TfidfTransformer(use_idf = True)),
                 ('clf', MultinomialNB(alpha=0.05))])
_ = multinomial_clf.fit(X_train, y_train)

我现在可以使用 multinomial_clf.steps 访问 CountVectorizer 和 TfidfTransformer,但我确信一定有更简单的方法。

非常感谢您的帮助!

【问题讨论】:

【参考方案1】:

可以通过grid_clf.best_estimator_找到具有最佳参数的管道

grid_clf.best_estimator_

Pipeline(steps=[('vect', CountVectorizer(analyzer='word', binary=False, decode_error='strict',
    dtype=<class 'numpy.int64'>, encoding='utf-8', input='content',
    lowercase=True, max_df=1.0, max_features=None, min_df=1,
    ngram_range=(1, 3), preprocessor=None, stop_words=None,
    strip...near_tf=False, use_idf=True)), ('clf', MultinomialNB(alpha=0.02, class_prior=None, fit_prior=True))])

但是我仍然对如何使用管道的转换器进行转换感到困惑。前两步实现了变换方法,而最后一步没有。但如果我尝试打电话:

grid_clf.best_estimator_.transform(['ok computer'])

我收到以下错误:

AttributeError: 'MultinomialNB' object has no attribute 'transform'

感谢您的帮助

【讨论】:

试试 grid_clf.best_estimator_.predict(['ok computer'])

以上是关于在 Pipeline 上进行网格搜索后更新变压器参数的主要内容,如果未能解决你的问题,请参考以下文章

Lesson 9.3 集成算法的参数空间与网格优化和使用网格搜索在随机森林上进行调参

scikit-learn 管道:对变压器参数进行网格搜索以生成数据

如何在没有交叉验证的情况下运行网格搜索?

在群集上运行网格搜索 CV 时 Azure ML Pipeline 失败

Sklearn Pipeline:将参数传递给自定义变压器?

调参必备---GridSearch网格搜索