簡體   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