【问题标题】:Hybrid Naive Bayes: How to train Naive Bayes Classifer with numeric and category variable together(sklearn)混合朴素贝叶斯:如何用数值和类别变量一起训练朴素贝叶斯分类器(sklearn)
【发布时间】:2017-01-03 12:46:10
【问题描述】:

基本上,sklearn 具有带有高斯核的朴素贝叶斯,可以对数值变量进行分类。

但是,如何处理同时包含数值变量和类别变量的数据集。

例如,下面给出一个数据集,如何在不离散数值变量的情况下一起使用sklearn训练混合数据类型?

+-------+--------+-----+-----------------+
| Index | Gender | Age | Product_Reviews |
+-------+--------+-----+-----------------+
| A     | Female |  20 | Good            |
| B     | Male   |  21 | Bad             |
| C     | Female |  25 | Bad             |
+-------+--------+-----+-----------------+

我的意思是,对于贝叶斯分类,P(A|B)= P(B|A)*P(A)/P(B)。

对于类别变量,P(B|A) 很容易算出来, 但对于数值变量,它应该遵循高斯分布。 并假设我们得到了具有高斯分布的 P(B|A)。

是否有任何包可以直接与这些一起使用?

请注意:此问题与How can I use sklearn.naive_bayes with (multiple) categorical features? 不重复 和Mixing categorial and continuous data in Naive Bayes classifier using scikit-learn

因为这个问题不想做一个带有虚拟变量的朴素贝叶斯(第一个问题),也不想做一个模型集成(第二个问题解决方案2)。

数学算法在这里https://tom.host.cs.st-andrews.ac.uk/ID5059/L15-HsuPaper.pdf,它用高斯分布计算条件概率,而不是用数值变量计算数字。并使用所有条件概率进行分类,包括类别变量(通过计数)和数值变量(高斯分布)

【问题讨论】:

标签: python statistics scikit-learn naivebayes


【解决方案1】:

答案直接来自朴素贝叶斯的数学

  1. 分类变量为您提供 log P(a|cat) ~ SUM_i log P(cat_i|a) + log P(a) (我省略了除以 P(cat),因为 NB 实现返回的是也无视)

  2. 连续变量给你同样的东西,log P(a|con) ~ SUM_i log P(con_i|a) + log P(a)(我省略了除以 P(cat),就像 NB实现返回也忽略它)

由于朴素贝叶斯特征是独立的,我们得到 x 的特征,其中包含分类和连续

P(a|x) ~ SUM_i log(x_i | a) + log P(a) = SUM_i log P(cat_i|a) + log P(a) + SUM_i log P(con_i|a) + log P (a) - log P(a) = 分类模型的对数似然 + 连续模型的对数似然 - a 类的对数先验

您可以从两个模型中读出所有这些元素,它们独立地适合数据的每个部分。请注意,这不是集成,您只需拟合两个模型并自行构建一个由于朴素贝叶斯的特定假设,因此您可以通过这种方式克服实现限制,仍然有效地在混合分布上构建有效的 NB 模型。请注意,这适用于任何一组混合分布,因此您可以在给定更多不同的 NB(使用不同的分布)的情况下执行相同操作。

【讨论】:

  • 谢谢。但是,请问基于这些,如何选择特征。
  • 这完全取决于您的数据以及您如何知道该功能是否是分类的。有时它很容易决定(字符串与数字),有时它更复杂(因为有时数字实际上是分类事物的代码)并且有效地你必须手动划分。如果您的数据是 .arff 格式,这应该会在标题中为您提供特征类型。
  • 好吧,也许我应该改一些字--如何使模型更好?呃,我的意思是如果所有的数据都是类别的,我们可以输出特征重要性,但是对于一些类别和一些连续的,有没有更好的方法或工具来做到这一点?
  • 特征选择不是“让模型更好”的方法。这种误解似乎经常出现。如果您的问题不是非常简单 - 首先不要使用朴素贝叶斯,这不是一个强大的模型,而且它很少能很好地工作(因为您需要非常干净、不相关和特定类型的数据)。与其尝试合并许多极其简单的技术,不如简单地使用一个强大的技术。虽然每种“简单”技术本身都是合理的,但不能保证将它们结合起来有任何意义。请尝试联合优化。
猜你喜欢
  • 2015-06-25
  • 2013-04-11
  • 2020-09-13
  • 2017-06-21
  • 2017-01-10
  • 2018-02-06
  • 2019-05-04
相关资源
最近更新 更多