在python中学习和使用增强的贝叶斯分类器

时间:2013-02-16 23:36:12

标签: python classification bayesian-networks

我正在尝试在python中使用森林(或树)增强贝叶斯分类器(Original introductionLearning)(最好是python 3,但python 2也可以接受) ,首先学习它(结构和参数学习),然后将其用于离散分类,并获得具有缺失数据的那些特征的概率。 (这就是为什么只有离散分类甚至好的天真分类器对我来说都不是很有用。)

我的数据进入的方式,我喜欢使用不完整数据的增量学习,但我甚至没有在文献中发现任何这两种情况,所以任何进行结构和参数学习和推理的东西都是如此是一个很好的答案。

似乎有一些非常独立且没有维护的python包大致朝着这个方向发展,但我还没有看到任何适度的近期(例如,我希望使用pandas进行这些计算这是合理的,但是OpenBayes几乎没有使用numpy),并且增强的分类器似乎完全没有我所见过的任何东西。

那么,我应该在哪里保存一些实现森林增强贝叶斯分类器的工作?在python类中是否有一个很好的实现Pearl的消息传递算法,或者这对于增强的贝叶斯分类器是否适用? 是否有一个可读的面向对象的实现,用于学习和推理其他语言的TAN Bayes分类器,可以转换为python?


我知道的现有包裹,但发现不合适

  • milk,它支持分类,但不支持贝叶斯分类器(我绝对需要分类和未指定功能的概率)
  • pebl,只进行结构学习
  • scikit-learn,只学习天真的贝叶斯分类器
  • OpenBayes,由于有人将其从numarray移植到numpy并且文档可以忽略不计,因此几乎没有变化。
  • libpgm,声称支持一套甚至不同的东西。根据主要文档,它进行推理,结构和参数学习。除了似乎没有任何方法可以进行精确推理。
  • Reverend声称是一个“贝叶斯分类器”,文档可以忽略不计,根据Robinson'seBay's bayesian Belief Networks,根据源代码,我得出的结论是它主要是一个垃圾邮件分类器。类似的方法,而不是贝叶斯分类器。
  • {{3}}允许构建通用贝叶斯网络并实现对它们的推断(精确和近似),这意味着它可以用于构建TAN,但是那里没有学习算法,并且方式BN是根据功能构建的,实现参数学习比假设的不同实现更困难。

5 个答案:

答案 0 :(得分:4)

我担心没有Random Naive Bayes分类器的开箱即用(不是我所知道的),因为它仍然是学术问题。以下文章介绍了组合RF和NB分类器(在付费墙后面)的方法:http://link.springer.com/chapter/10.1007%2F978-3-540-74469-6_35

我认为你应该坚持使用scikit-learn,这是最受欢迎的Python统计模块之一(以及NLTK),并且有很好的文档记录。

scikit-learn有一个随机森林模块:http://scikit-learn.org/stable/modules/ensemble.html#forests-of-randomized-trees。有一个子模块可能(我坚持不确定性)用于管道向NB分类器:

  

RandomTreesEmbedding实现了无监督的转换   数据。使用完全随机树的森林,RandomTreesEmbedding   通过数据点最终的叶子的索引对数据进行编码。   然后以K-K方式编码该索引,导致高   维,稀疏二进制编码。可以非常计算该编码   有效地,然后可以用作其他学习任务的基础。   选择代码可以影响代码的大小和稀疏性   树木的数量和每棵树的最大深度。对于每棵树   整体,编码包含一个条目。编码的大小   最多是n_estimators * 2 ** max_depth,叶子的最大数量   在森林里。

     

由于邻近数据点更可能位于同一叶子中   对于树,变换执行隐式的非参数   密度估计。

当然还有Naive Bayes分类器的核心实现,可以逐步使用:http://scikit-learn.org/stable/modules/naive_bayes.html

  

Discrete naive Bayes模型可用于处理大规模文本   完整训练集可能不适合的分类问题   在记忆中。为了处理这种情况,MultinomialNB和BernoulliNB   公开一个partial_fit方法,可以像往常一样逐步使用   与核心外分类中演示的其他分类器一样   文本文件。

答案 1 :(得分:3)

我对如何使用libpgm进行精确推理感到困惑。但事实证明这是可能的。例如(from libpgm docs),

import json

from libpgm.graphskeleton import GraphSkeleton
from libpgm.nodedata import NodeData
from libpgm.discretebayesiannetwork import DiscreteBayesianNetwork
from libpgm.tablecpdfactorization import TableCPDFactorization

# load nodedata and graphskeleton
nd = NodeData()
skel = GraphSkeleton()
nd.load("../tests/unittestdict.txt")
skel.load("../tests/unittestdict.txt")

# toporder graph skeleton
skel.toporder()

# load evidence
evidence = dict(Letter='weak')
query = dict(Grade='A')

# load bayesian network
bn = DiscreteBayesianNetwork(skel, nd)

# load factorization
fn = TableCPDFactorization(bn)

# calculate probability distribution
result = fn.condprobve(query, evidence)

# output
print json.dumps(result.vals, indent=2)
print json.dumps(result.scope, indent=2)
print json.dumps(result.card, indent=2)
print json.dumps(result.stride, indent=2)

要让示例正常运行,here is the datafile(我将None替换为null并保存为.json。)

我知道游戏已经很晚了,但这是我在搜索资源用Python做贝叶斯网络时发现的最好的帖子。我以为我会回答,以防其他人在寻找这个。 (对不起,会有评论,但只是注册了SO来回答这个问题,并且代表不够高。)

答案 2 :(得分:1)

似乎还没有这样的事情。

目前最接近的似乎是eBay的Belief Networks的开源实现bayesian。它实现了推理(两种精确的方式和近似),这意味着它可以用于构建TAN。在我的open20q存储库中可以找到一个示例(目前仍然是一段丑陋的意大利面条代码)。

  • 优点:
    • 有效。 也就是说,我现在基于bayesian信念网络推断,实现了TAN推理。
    • 分别使用Apache 2.0和3子句BSD样式许可证,合法地将bayesian代码和libpgm代码结合起来,以尝试推理并学习如何工作。
  • 缺点:
    • bayesian中没有任何学习内容。尝试将libpgm学习与bayesian课程和推理相结合将是一项挑战。
    • 更重要,因为bayesian假定节点由固定python函数的因子给出。参数学习需要一些包装代码才能调整概率。
    • bayesian是用纯python编写的,使用dicts等作为基本结构,不使用任何加速numpypandas或类似的包可能带来的,因此很慢即便是我建立的一个小例子。

答案 3 :(得分:1)

R' bnlearn实现了Naive Bayes和Tree-augmented Naive Bayes分类器。您可以使用rpy2将这些文件移植到Python。

http://cran.r-project.org/web/packages/bnlearn/bnlearn.pdf

答案 4 :(得分:0)

我知道它有点晚了,但Octave forge NaN package可能会让你感兴趣。该软件包中的一个分类器是增强朴素贝叶斯分类器。代码是GPL,因此您可以轻松地将其移植到Python。