繁体   English   中英

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

[英]Learning and using augmented Bayes classifiers in python

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

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

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

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


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

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

我担心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的方式对该索引进行编码,从而导致高维,稀疏二进制编码。 可以非常有效地计算该编码,然后可以将其用作其他学习任务的基础。 通过选择树的数量和每棵树的最大深度,可以影响代码的大小和稀疏性。 对于整体中的每个树,编码包含一个条目。 编码的大小最多为n_estimators * 2 ** max_depth,即森林中叶子的最大数量。

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

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

离散朴素贝叶斯模型可用于解决大规模文本分类问题,完整训练集可能不适合内存。 为了处理这种情况,MultinomialNB和BernoulliNB都公开了一个partial_fit方法,该方法可以像其他分类器一样逐步使用,如文本文档的核外分类所示。

我同样对如何用libpgm进行精确推理感到困惑。 但事实证明这是可能的。 例如( 来自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)

为了让例子来工作, 这里是数据文件 (我换成Nonenull并保存为一个.json )。

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

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

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

似乎还没有这样的事情。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM