在Pipeline上搜索网格后更新变换器参数

时间:2016-10-17 17:36:01

标签: python scikit-learn pipeline grid-search

我有一个简单的文本分析和分类管道,包括CountVectorizer,TfidfTransformer,最后是Multinomial Naive Bayes分类器。

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 个答案:

答案 0 :(得分:0)

可以使用df %>% group_by(Location) %>% summarise(x = list(broom::tidy(summary(Result)))) %>% tidyr::unnest() #> # A tibble: 3 x 7 #> Location minimum q1 median mean q3 maximum #> <fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> #> 1 Alpha 1. 6.25 26.5 38.5 58.8 100. #> 2 Beta 1. 10.5 20.0 23.7 35.0 50. #> 3 Gamma 2. 6.00 10.0 14.0 20.0 30.

找到具有最佳参数的管道
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'])

感谢您的帮助