如何在scikit-learn中提取MultinomialNB Pipeline训练模型中的单词特征


# Note: The runnable code example is at the end of this question ####
# Assume X_train contains cleaned sentence text as input data. Y_train are class labels. 
# parameters stores the parameter to be tried by GridSearchCV
text_clf_Pipline_MultinomialNB = Pipeline([('vect', CountVectorizer()),
                                           ('tfidf', TfidfTransformer()),
                                           ('clf', MultinomialNB()),                     
                                          ])
gs_clf = GridSearchCV(text_clf_Pipline_MultinomialNB, parameters, n_jobs=-1)   
gs_classifier = gs_clf.fit(X_train, y_train)

现在,我可以根据sklearn.naive_bayes从gs_classifier中获取feature_log_prob_。多项式NB文档。下面是一个示例。

我的问题是如何让单词对应于每个对数概率?CountVectorizer(( 和 TfidfTransformer(( 都做了特征选择。GridSearchCV 对象在哪里存储选定的单词/ngram 特征?如何让它们匹配回概率?

我已经检查了gs_classifier的成员,但没有找到选定的功能。谢谢。

下面是一个可运行的示例:

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.grid_search import GridSearchCV
from sklearn.pipeline import Pipeline
from sklearn.naive_bayes import MultinomialNB
from inspect import getmembers
X_train = ['qwe rtyuiop', 'asd fghj kl', 'zx cv bnm', 'qw erty ui op', 'as df ghj kl', 'zxc vb nm', 'qwe rt yu iop', 'asdfg hj kl', 'zx cvb nm',
          'qwe rt yui op', 'asd fghj kl', 'zx cvb nm', 'qwer tyui op', 'asd fg hjk l', 'zx cv b nm', 'qw ert yu iop', 'as df gh jkl', 'zx cvb nm',
           'qwe rty uiop', 'asd fghj kl', 'zx cvbnm', 'qw erty ui op', 'as df ghj kl', 'zxc vb nm', 'qwe rtyu iop', 'as dfg hj kl', 'zx cvb nm',
          'qwe rt yui op', 'asd fg hj kl', 'zx cvb nm', 'qwer tyuiop', 'asd fghjk l', 'zx cv b nm', 'qw ert yu iop', 'as df gh jkl', 'zx cvb nm']    
y_train = ['1', '2', '3', '1', '1', '3', '1', '2', '3',
          '1', '2', '3', '1', '4', '1', '2', '2', '4', 
          '1', '2', '3', '1', '1', '3', '1', '2', '3',
          '1', '2', '3', '1', '4', '1', '2', '2', '4']    

parameters = {  
                'clf__alpha': (1e-1, 1e-2),
                 'vect__ngram_range': [(1,2),(1,3)],
                 'vect__max_df': (0.9, 0.98)
            }
text_clf_Pipline_MultinomialNB = Pipeline([('vect', CountVectorizer()),
                                           ('tfidf', TfidfTransformer()),
                                           ('clf', MultinomialNB()),                     
                                          ])
gs_clf = GridSearchCV(text_clf_Pipline_MultinomialNB, parameters, n_jobs=-1)   
gs_classifier = gs_clf.fit(X_train, y_train)
nbclf = getmembers(gs_classifier.best_estimator_)[2][1]['named_steps']['clf']
nbclf.feature_log_prob_ 

那么问题是:如何让训练模型中的单词特征列表对应于对数概率?另外,例如,输出_log_prob_哪个概率对应于类"1"的单词"qwe"?


得到答案后编辑:安德烈亚斯的回答有效:

gs_classifier.best_estimator_.named_steps['vect'].get_feature_names() 

与此类似,有一种更好的方法可以索引到 GridSearchCV 中以获取经过训练的分类器

nbclf = gs_classifier.best_estimator_.named_steps['clf']

为什么需要getmembers?要获取与feature_log_prob_对应的功能名称,请执行以下操作:

gs_classifier.best_estimator_.named_steps['vect'].get_feature_names()

相关内容

  • 没有找到相关文章

最新更新