16

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

我的数据进来的方式,我喜欢从不完整的数据中使用增量学习,但我什至在文献中都没有发现任何可以同时做这两种方法的东西,所以任何做结构和参数学习和推理的东西都是好的回答。

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

那么,我应该从哪里节省一些实现森林增强贝叶斯分类器的工作呢?在 python 类中是否有一个很好的 Pearl 消息传递算法的实现,或者这对于增强的贝叶斯分类器是否不合适?是否有一个可读的面向对象的实现,用于学习和推断其他语言的 TAN 贝叶斯分类器,可以翻译成 python?


我知道但发现不合适的现有软件包是

  • milk,它确实支持分类,但不支持贝叶斯分类器(我肯定需要分类和未指定特征的概率)
  • pebl,它只做结构学习
  • scikit-learn,它只学习朴素贝叶斯分类器
  • OpenBayesnumarray,自从有人将它移植到numpy并且文档可以忽略不计以来,它几乎没有改变。
  • libpgm,它声称支持一组甚至不同的东西。根据主要文档,它进行推理、结构和参数学习。除了似乎没有任何精确推断的方法。
  • Reverend声称自己是“贝叶斯分类器”,文档可以忽略不计,通过查看源代码,我得出的结论是,根据Robinson和类似的方法,它主要是垃圾邮件分类器,而不是贝叶斯分类器。
  • eBay 的bayesianBelief Networks允许构建通用贝叶斯网络并对其进行推理(精确和近似),这意味着它可以用于构建 TAN,但其中没有学习算法,以及 BN 是从函数构建的方式意味着实现参数学习比假设的不同实现更困难。
4

5 回答 5

5

恐怕没有开箱即用的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,森林中的最大叶子数。

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

当然还有朴素贝叶斯分类器的核心实现,可以增量使用:http ://scikit-learn.org/stable/modules/naive_bayes.html

离散朴素贝叶斯模型可用于解决完整训练集可能无法放入内存的大规模文本分类问题。为了处理这种情况,MultinomialNB 和 BernoulliNB 都公开了一个 partial_fit 方法,该方法可以与其他分类器一起增量使用,如文本文档的核心分类中所示。

于 2013-11-26T10:20:17.397 回答
3

对于如何使用 libpgm 进行精确推断,我同样感到困惑。然而,事实证明这是可能的。例如(来自 libpgm 文档),

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 来回答这个问题,并且代表还不够高。)

于 2014-07-15T01:22:31.793 回答
2

Rbnlearn实现了朴素贝叶斯和树增强朴素贝叶斯分类器。您可以使用 rpy2 将这些移植到 Python。

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

于 2015-03-12T01:04:20.113 回答
1

好像还没有这种东西。

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

  • 优点:
    • 有用。也就是说,我现在有了一个基于bayesian信念网络推理的 TAN 推理实现。
    • 分别使用 Apache 2.0 和 3-clause BSD 风格的许可证,合法地结合bayesian代码和libpgm代码来尝试进行推理和学习是可行的。
  • 缺点:
    • 中没有任何学习bayesian。尝试将libpgm学习与bayesian课堂和推理结合起来将是一项挑战。
    • 甚至bayesian假设节点是由固定 python 函数的因子给出的。参数学习需要一些包装代码来调整概率。
    • bayesian是用纯 python 编写的,使用 dicts 等作为基本结构,不使用任何 speedupnumpypandas类似的包可能带来的,因此即使对于我构建的小例子也很慢。
于 2013-12-02T12:20:36.143 回答
-1

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

于 2014-02-10T01:45:53.267 回答