我正在尝试在python
中使用森林(或树)增强贝叶斯分类器(Original introduction,Learning)(最好是python 3,但python 2也可以接受) ,首先学习它(结构和参数学习),然后将其用于离散分类,并获得具有缺失数据的那些特征的概率。 (这就是为什么只有离散分类甚至好的天真分类器对我来说都不是很有用。)
我的数据进入的方式,我喜欢使用不完整数据的增量学习,但我甚至没有在文献中发现任何这两种情况,所以任何进行结构和参数学习和推理的东西都是如此是一个很好的答案。
似乎有一些非常独立且没有维护的python包大致朝着这个方向发展,但我还没有看到任何适度的近期(例如,我希望使用pandas
进行这些计算这是合理的,但是OpenBayes
几乎没有使用numpy
),并且增强的分类器似乎完全没有我所见过的任何东西。
那么,我应该在哪里保存一些实现森林增强贝叶斯分类器的工作?在python类中是否有一个很好的实现Pearl的消息传递算法,或者这对于增强的贝叶斯分类器是否适用? 是否有一个可读的面向对象的实现,用于学习和推理其他语言的TAN Bayes分类器,可以转换为python?
我知道的现有包裹,但发现不合适
milk
,它支持分类,但不支持贝叶斯分类器(我绝对需要分类和未指定功能的概率)pebl
,只进行结构学习scikit-learn
,只学习天真的贝叶斯分类器OpenBayes
,由于有人将其从numarray
移植到numpy
并且文档可以忽略不计,因此几乎没有变化。libpgm
,声称支持一套甚至不同的东西。根据主要文档,它进行推理,结构和参数学习。除了似乎没有任何方法可以进行精确推理。bayesian
Belief Networks,根据源代码,我得出的结论是它主要是一个垃圾邮件分类器。类似的方法,而不是贝叶斯分类器。答案 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推理。bayesian
代码和libpgm
代码结合起来,以尝试推理并学习如何工作。bayesian
中没有任何学习内容。尝试将libpgm
学习与bayesian
课程和推理相结合将是一项挑战。bayesian
假定节点由固定python函数的因子给出。参数学习需要一些包装代码才能调整概率。bayesian
是用纯python编写的,使用dicts等作为基本结构,不使用任何加速numpy
,pandas
或类似的包可能带来的,因此很慢即便是我建立的一个小例子。答案 3 :(得分:1)
R' bnlearn
实现了Naive Bayes和Tree-augmented Naive Bayes分类器。您可以使用rpy2将这些文件移植到Python。
答案 4 :(得分:0)
我知道它有点晚了,但Octave forge NaN package可能会让你感兴趣。该软件包中的一个分类器是增强朴素贝叶斯分类器。代码是GPL,因此您可以轻松地将其移植到Python。