由于我的分类器在测试数据上的准确率大约为99%,我有点怀疑并希望深入了解我的NB分类器中最具信息性的功能,以了解它正在学习哪些功能。以下主题非常有用:How to get most informative features for scikit-learn classifiers?
至于我的功能输入,我还在玩,目前我正在测试一个简单的unigram模型,使用CountVectorizer:
vectorizer = CountVectorizer(ngram_range=(1, 1), min_df=2, stop_words='english')
关于上述主题,我发现了以下功能:
def show_most_informative_features(vectorizer, clf, n=20):
feature_names = vectorizer.get_feature_names()
coefs_with_fns = sorted(zip(clf.coef_[0], feature_names))
top = zip(coefs_with_fns[:n], coefs_with_fns[:-(n + 1):-1])
for (coef_1, fn_1), (coef_2, fn_2) in top:
print "\t%.4f\t%-15s\t\t%.4f\t%-15s" % (coef_1, fn_1, coef_2, fn_2)
这给出了以下结果:
-16.2420 114th -4.0020 said
-16.2420 115 -4.6937 obama
-16.2420 136 -4.8614 house
-16.2420 14th -5.0194 president
-16.2420 15th -5.1236 state
-16.2420 1600 -5.1370 senate
-16.2420 16th -5.3868 new
-16.2420 1920 -5.4004 republicans
-16.2420 1961 -5.4262 republican
-16.2420 1981 -5.5637 democrats
-16.2420 19th -5.6182 congress
-16.2420 1st -5.7314 committee
-16.2420 31st -5.7732 white
-16.2420 3rd -5.8227 security
-16.2420 4th -5.8256 states
-16.2420 5s -5.8530 year
-16.2420 61 -5.9099 government
-16.2420 900 -5.9464 time
-16.2420 911 -5.9984 department
-16.2420 97 -6.0273 gop
它有效,但我想知道这个功能是什么来解释结果。大多数情况下,我很挣与' coef _'属性。
我知道左侧是系数最低的前20个特征名称,右侧是具有最高系数的特征。但是这究竟是如何工作的,我该如何解释这个概述呢?这是否意味着左侧是负面类的最具信息性的特征,而右侧是正面类最具信息性的特征?
此外,在左侧看起来好像功能名称按字母顺序排序,这是正确的吗?
答案 0 :(得分:8)
MultinomialNB的coef_属性是朴素贝叶斯模型作为线性分类器模型的重新参数化。对于二元分类问题,这基本上是给定正类的特征的估计概率的对数。这意味着更高的值意味着积极阶级的更重要的特征。
上面的图片显示了第一列中前20个最低值(预测特征较少)和第二列中前20个高值(最高预测特征)。
答案 1 :(得分:0)
coef_
属性中显示的数字是概率的对数。对于每个预测特征,所有这些概率的总和将等于 1,coef_
属性的长度等于预测特征的数量。要自己检查这一点,您可以使用此列表推导式:
sum([np.exp(1)**x for x in clf.coef_[0]]) # The sum of probabilities == 1
此外,为了回答@LN_P 的评论,.classes_
属性将显示您查看 coef_
数组时引用的要素的顺序。
这是我遇到的类似帖子: How to calculate feature_log_prob_ in the naive_bayes MultinomialNB