如何在高斯朴素贝叶斯中获得特征重要性

Posted

技术标签:

【中文标题】如何在高斯朴素贝叶斯中获得特征重要性【英文标题】:How to get the feature importance in Gaussian Naive Bayes 【发布时间】:2020-11-06 01:02:49 【问题描述】:

我有一个针对数据集运行的 Gaussian naive bayes 算法。我需要的是获得目标类的特征重要性(特征的影响力)。

这是我的代码:

from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(inputs, target, test_size=0.2)

gaussian_nb = GaussianNB()
gaussian_nb.fit(X_train, y_train)
gaussian_nb.score(X_test, y_test)*100

我试过了:

importance = gaussian_nb.coefs_ # and even tried coef_

它给出了一个错误:

AttributeError: 'GaussianNB' 对象没有属性 'coefs_'

有人可以帮帮我吗?

【问题讨论】:

【参考方案1】:

如果您查看documentation,朴素贝叶斯不具备这些特征重要性的属性。您可以使用get_params 方法来学习先验知识,但不是真正的个人特征。如果您需要了解特征重要性,一个好的解决方案是对决策树之类的分析进行分析,然后使用最重要的特征实现GaussianNB

【讨论】:

那么从不同的模型中获取特征重要性并用不同的模型预测值不是问题吗? 显然不会完全相同,这取决于您为什么要使用重要性开头;我只是为了您的理解而提出这个建议,并且更多地作为特征选择的指南(这是一种有效的技术)。【参考方案2】:

GaussianNB 不提供评估特征重要性的内在方法。朴素贝叶斯方法通过确定与特征相关的条件和无条件概率来工作,并预测具有最高概率的类别。因此,没有计算或与您用于训练模型的特征相关联的系数(与其documentation 相比)。

话虽如此,您可以在模型经过训练后应用事后分析模型的方法。其中一种方法是Permutation Importance,它也方便地在scikit-learn 中实现。以您提供的代码为基础,您可以通过以下方式使用permutation_importance

from sklearn.inspection import permutation_importance
from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import train_test_split


X_train, X_test, y_train, y_test = train_test_split(inputs, target, test_size=0.2)

gaussian_nb = GaussianNB()
gaussian_nb.fit(X_train, y_train)

imps = permutation_importance(gaussian_nb, X_test, y_test)
print(imps.importances_mean)

请注意,排列重要性取决于数据集,您必须传递数据集才能获取值。这可以是您用于训练模型的相同数据,即X_trainy_train,也可以是您保存用于评估的保留集,例如X_testy_test。就泛化能力而言,后一种方法只是更好的选择。

如果您想进一步了解 Permutation Importance 作为一种方法及其工作原理,那么scikit-learn 提供的user guide 绝对是一个好的开始。

【讨论】:

感谢您提供此解决方法。我得到的值看起来都是负值。你能描述一下这里发生了什么吗?目标变量是一个二进制值(10)。所以它会输出这样的重要性:[-0.00714286 -0.00571429 -0.00714286 -0.00428571 0. -0.00428571 -0.00571429 -0.00857143 -0.00428571 -0.00285714 0. 0.20428571 -0.00428571 0. -0.00428571 -0.00142857 -0.00571429 -0.00571429 0. -0.00571429 -0.00142857 -0.01142857 0. -0.00714286 -0.00142857 -0.00428571 -0.00285714 0. ] 这是什么意思? scikit-learn 中的约定是较高的返回值优于较低的返回值。这里的数字代表得分的平均差(这里:准确性),当特定特征的值在获得得分之前被随机打乱时,算法确定。因此,例如,0.20 的值意味着改组此功能导致准确度下降 0.20。因此,此功能非常重要。负数当然是相反的意思:在对相应特征进行洗牌时,准确率实际上会提高,所以它们并不那么重要。 请记住,这些数字是五次迭代的计算平均值,并且负数非常接近于 0。虽然不能保证模型在没有负数特征的情况下实际上表现更好值,可以公平地说,这些特征在排列重要性方面并不重要。 嗨,你说... feature resulted in a drop of 0.20 in accuracy. Hence, this feature is very important.。那么为什么降低准确性的功能更重要呢?你还说actually increased when shuffling the negative numbers,所以提高准确性不是一件好事吗?我很困惑。 置换重要性背后的想法是,打乱一个特征的所有值会破坏它与目标变量的关系。因此,一个具有 shuffled 特征 的模型(原本确实很重要)应该表现更差。这是有道理的,对吧?现在,此过程的影响在scikit_learn 中报告为正数,以符合上述约定。我希望这能澄清事情。 TL;DR:如果 shuffle 一个特征使模型表现更差,这意味着这个特征很重要,因此会得到一个正值。

以上是关于如何在高斯朴素贝叶斯中获得特征重要性的主要内容,如果未能解决你的问题,请参考以下文章

如何使用朴素贝叶斯实现 TF_IDF 特征加权

三种常用的朴素贝叶斯实现算法——高斯朴素贝叶斯伯努利朴素贝叶斯多项式朴素贝叶斯

在朴素贝叶斯中的概率估计中的 m 应该被视为啥

朴素贝叶斯:基于概率论的分类模型

实战|朴素贝叶斯分类对文档进行分类

机器学习面试题——朴素贝叶斯