如何在 scikit-learn 的 MultinomialNB Pipeline 训练模型中提取单词特征?
How to extract the word features in trained model of MultinomialNB Pipeline in scikit-learn?
# 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.MultinomialNB documentation从gs_classifier得到feature_log_prob_。这是一个例子。
我的问题是如何得到每个log概率对应的单词?
CountVectorizer() 和 TfidfTransformer() 都进行了特征选择。
GridSearchCV 对象在哪里存储选定的 word/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_ 输出中的哪个概率对应于 class '1' 的单词 'qwe'?
得到答案后编辑:
Andreas 的回答有效:
gs_classifier.best_estimator_.named_steps['vect'].get_feature_names()
与此类似,有一个更好的方法可以索引到 GridSearchCV 中以获得经过训练的 classifier
nbclf = gs_classifier.best_estimator_.named_steps['clf']
为什么需要 getmembers
?
获取feature_log_prob_
对应的特征名称:
gs_classifier.best_estimator_.named_steps['vect'].get_feature_names()
# 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.MultinomialNB documentation从gs_classifier得到feature_log_prob_。这是一个例子。
我的问题是如何得到每个log概率对应的单词? CountVectorizer() 和 TfidfTransformer() 都进行了特征选择。 GridSearchCV 对象在哪里存储选定的 word/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_ 输出中的哪个概率对应于 class '1' 的单词 'qwe'?
得到答案后编辑: Andreas 的回答有效:
gs_classifier.best_estimator_.named_steps['vect'].get_feature_names()
与此类似,有一个更好的方法可以索引到 GridSearchCV 中以获得经过训练的 classifier
nbclf = gs_classifier.best_estimator_.named_steps['clf']
为什么需要 getmembers
?
获取feature_log_prob_
对应的特征名称:
gs_classifier.best_estimator_.named_steps['vect'].get_feature_names()