在 python 中学习和使用增强的贝叶斯分类器
Posted
技术标签:
【中文标题】在 python 中学习和使用增强的贝叶斯分类器【英文标题】:Learning and using augmented Bayes classifiers in python 【发布时间】:2013-02-01 16:56:38 【问题描述】:我正在尝试在python
中使用森林(或树)增强贝叶斯分类器(Original introduction,Learning)(最好是 python 3,但 python 2 也可以),首先学习它(两者结构和参数学习),然后将其用于离散分类并获得具有缺失数据的特征的概率。 (这就是为什么只是离散分类甚至是好的朴素分类器对我来说不是很有用。)
我的数据进入方式,我很想从不完整的数据中使用增量学习,但我什至在文献中都没有发现任何可以同时进行这两种方法的东西,所以任何可以进行结构和参数学习和推理的东西是一个很好的答案。
似乎有一些非常独立且未维护的 python 包大致朝这个方向发展,但我没有看到任何最近的东西(例如,我希望使用pandas
进行这些计算将是合理,但OpenBayes
几乎不使用numpy
),而且我所见过的任何东西似乎都完全没有增强分类器。
那么,我应该从哪里节省一些实现森林增强贝叶斯分类器的工作?在 python 类中是否有一个很好的 Pearl 消息传递算法实现,或者这对于增强的贝叶斯分类器是否不合适? 是否有可读的面向对象的实现,用于学习和推断其他语言的 TAN 贝叶斯分类器,可以翻译成 python?
我知道但发现不合适的现有软件包是
milk
,它支持分类,但不支持贝叶斯分类器(我肯定需要分类和未指定特征的概率)
pebl
,只做结构学习
scikit-learn
,它只学习朴素贝叶斯分类器
OpenBayes
,自从有人将它从 numarray
移植到 numpy
后,它几乎没有变化,而且文档可以忽略不计。
libpgm
,它声称支持一组甚至不同的东西。根据主要文档,它进行推理、结构和参数学习。除了似乎没有任何精确推断的方法。
Reverend 声称是“贝叶斯分类器”,文档可忽略不计,根据Robinson's 和类似方法,通过查看源代码,我得出的结论是它主要是垃圾邮件分类器,而不是贝叶斯分类器分类器。
eBay's bayesian
Belief Networks 允许构建通用贝叶斯网络并对其进行推理(精确和近似),这意味着它可用于构建 TAN,但其中没有学习算法,以及 BN 是从函数构建的方式意味着实现参数学习比假设的不同实现更困难。
【问题讨论】:
你看过milk
吗?
我想要一个贝叶斯分类器的原因是,对于这个特定的应用程序,我需要知道每个可能类的概率。 milk
似乎根本不支持贝叶斯分类器(或者至少我不知道如何 - 如果 milk
s 分类器中的任何一个给我概率,请告诉我),因此超出了这个问题的范围。
Reverend 也是一个贝叶斯分类器,您可能会添加到可能不符合要求的列表中。 (?)
似乎我需要将bayesian
和libpgm
混合在一起,并在上面添加我自己的东西以获得我想要的东西。不幸的是,这只是一个小项目,因此可能需要一些时间。
【参考方案1】:
恐怕没有开箱即用的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 通过数据点最终所在的叶子的索引对数据进行编码。 然后以 one-of-K 方式对该索引进行编码,从而导致高 维,稀疏二进制编码。这种编码可以很计算 高效,然后可以用作其他学习任务的基础。 代码的大小和稀疏性可以通过选择 树的数量和每棵树的最大深度。对于每棵树 ensemble,编码包含一个条目。编码大小 最多为 n_estimators * 2 ** max_depth,最大叶子数 在森林里。
因为相邻的数据点更有可能位于同一个叶子中 对一棵树,变换执行一个隐式的、非参数的 密度估计。
当然还有一个朴素贝叶斯分类器的核外实现,可以增量使用:http://scikit-learn.org/stable/modules/naive_bayes.html
离散朴素贝叶斯模型可用于处理大规模文本 整个训练集可能不适合的分类问题 在记忆中。为了处理这种情况,MultinomialNB 和 BernoulliNB 公开一个可以增量使用的 partial_fit 方法 与核外分类中所示的其他分类器一起使用 文本文档。
【讨论】:
随机森林贝叶斯不是我想要的,因为我没有遇到过它们。感谢您指出它们,我会看看它们(或相关的东西)是否适合我的应用程序。【参考方案2】:对于如何使用 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 来回答这个问题,rep 不够高。)
【讨论】:
【参考方案3】:R 的bnlearn
实现了朴素贝叶斯和树增强朴素贝叶斯分类器。您可以使用 rpy2 将这些移植到 Python。
http://cran.r-project.org/web/packages/bnlearn/bnlearn.pdf
【讨论】:
欢迎加入堆栈,感谢您的指点!我之前隐约听说过bnlearn
,但对于rpy2
,这可能确实值得仔细观察!【参考方案4】:
好像还没有这样的东西。
目前最接近的似乎是 eBay 的 Belief Networks 的开源实现 bayesian
。它实现了推理(两种精确方式和近似方式),这意味着它可以用于构建 TAN。可以在我的open20q
存储库中找到一个示例(目前仍然是一段丑陋的意大利面条代码)。
bayesian
信念网络推理的 TAN 推理实现。
分别使用 Apache 2.0 和 3-clause BSD 风格的许可,合法地结合 bayesian
代码和 libpgm
代码来尝试让推理和学习发挥作用。
缺点:
bayesian
中没有任何学习内容。尝试将 libpgm
学习与 bayesian
类和推理结合起来将是一项挑战。
甚至bayesian
假设节点由固定python 函数的因子给出。参数学习需要一些包装代码来调整概率。
bayesian
是用纯 python 编写的,使用 dicts 等作为基本结构,不使用 numpy
、pandas
或类似的包可能带来的任何加速,因此即使对于我构建的小例子来说也很慢。
【讨论】:
【参考方案5】:我知道今天有点晚了,但是您可能会对 Octave forge NaN package 感兴趣。此包中的分类器之一是增强朴素贝叶斯分类器。该代码是 GPL 的,因此您可以轻松地将其移植到 Python。
【讨论】:
以上是关于在 python 中学习和使用增强的贝叶斯分类器的主要内容,如果未能解决你的问题,请参考以下文章