SkLearn多项式朴素贝叶斯分类器:最具信息量的特征

11
由于我的分类器在测试数据上的准确率约为99%,我有些怀疑并希望了解NB分类器最具信息量的特征,以查看它正在学习哪种特征。以下主题非常有用:如何获取scikit-learn分类器的最具信息量的特征? 至于我的特征输入,我仍在尝试中,目前正在使用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个特征名称,右边是最大系数的特征。但具体是如何工作的,我该如何解释这个概述呢?这是否意味着左边包含了负类别最具信息量的特征,右边包含了正类别最具信息量的特征?
此外,在左侧看起来好像特征名称是按字母顺序排序的,这是正确的吗?
2个回答

12

MultinomialNB的coef_属性是将朴素贝叶斯模型重新参数化为线性分类器模型。对于二元分类问题,这基本上是特征在正类中的估计概率的对数。这意味着较高的值意味着对于正类而言更重要的特征。

上述打印结果显示了第一列中前20个最低值(表示预测性较弱的特征),以及第二列中前20个最高值(表示预测性最强的特征)。


6
谢谢!那很有道理。不过现在我想知道如何获取另一类别(负面类别)的最重要特征? - Alice
2
np.array_equal(clf.coef_[0], clf.feature_log_prob_[1]) 返回 True,因此我认为 clf.feature_log_prob_[1] 给出了负类的特征系数。 - Despe1990
1
我有两个类:array([0, 1])。当我调用coef_[0]时,它会给我正类(1)的系数还是负类(0)的系数? - LN_P

0

coef_ 属性中显示的数字是概率的对数。所有这些概率的总和将等于每个预测特征的1,而 coef_ 属性的长度等于预测特征的数量。要自行检查此内容,您可以使用以下列表推导式:

sum([np.exp(1)**x for x in clf.coef_[0]])  # The sum of probabilities == 1

此外,为了回答@LN_P的评论,.classes_属性将显示在查看coef_数组时引用的特征的顺序。
我找到了一篇类似的帖子: 如何计算朴素贝叶斯MultinomialNB中的feature_log_prob_

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接