我有一个简单的用于文本分析和分类的管道,它由一个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,但我确信一定有更简单的方法。
谢谢你的帮助!
使用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'
谢谢你的帮助