首页 文章

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

提问于
浏览
14

我正在尝试在 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's和类似的方法,而不是贝叶斯分类器 .

  • eBay's bayesian Belief Networks允许构建通用贝叶斯网络并实现对它们的推断(精确和近似),这意味着它可以用于构建TAN,但是那里没有学习算法,并且BN的构建方式来自函数意味着实现参数学习比假设的不同实现更难 .

5 回答

  • 0

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

  • 0

    我担心 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 . 有一个子模块 may (我坚持不确定性)用于管道向NB分类器:

    RandomTreesEmbedding实现数据的无监督转换 . 使用完全随机树的森林,RandomTreesEmbedding通过数据点结束的叶子的索引对数据进行编码 . 然后以K的方式对该索引进行编码,从而导致高维,稀疏二进制编码 . 可以非常有效地计算该编码,然后可以将其用作其他学习任务的基础 . 通过选择树的数量和每棵树的最大深度,可以影响代码的大小和稀疏性 . 对于整体中的每个树,编码包含一个条目 . 编码的大小最多为n_estimators * 2 ** max_depth,即森林中叶子的最大数量 . 由于相邻数据点更可能位于树的同一叶子内,因此变换执行隐式的非参数密度估计 .

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

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

  • 4

    我同样对如何用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来回答这个问题而且代表不够高 . )

  • 3

    R的 bnlearn 具有Naive Bayes和Tree-augmented朴素贝叶斯分类器的实现 . 您可以使用rpy2将这些移植到Python .

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

  • 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 或类似的软件包可能带来的,因此即使对于我构建的小例子也很慢 .

相关问题