Изучение и использование дополненных байесовских классификаторов в python - программирование
Подтвердить что ты не робот

Изучение и использование дополненных байесовских классификаторов в python

Я пытаюсь использовать добавленный в лес (или дерево) классификатор Байеса (Оригинальное введение, Обучение) в python (предпочтительно python 3, но python 2 также будет приемлемым), сначала изучив его (как структуру, так и процесс обучения), а затем используя его для дискретной классификации и получения вероятностей для тех функций с отсутствующими данными. (Вот почему просто дискретная классификация и даже хорошие наивные классификаторы мне не очень полезны.)

Как поступают мои данные, я бы хотел использовать инкрементное обучение из неполных данных, но я даже не нашел ничего, что делало бы это в литературе, так что все, что делает структуру и параметрическое обучение и вывод вообще это хороший ответ.

Похоже, что есть несколько очень отдельных и незавершенных пакетов python, которые идут примерно в этом направлении, но я не видел ничего, что было бы умеренно недавним (например, я ожидал бы, что использование pandas для этих вычислений будет разумно, но OpenBayes едва использует numpy), и расширенные классификаторы кажутся совершенно отсутствующими из всего, что я видел.

Итак, где я должен искать, чтобы спасти меня, какую-то работу по внедрению расширенного леса Байеса? Есть ли хорошая реализация алгоритма передачи сообщений Pearl в классе python, или это будет неуместно для расширенного классификатора Байеса? Есть ли читаемая объектно-ориентированная реализация для изучения и вывода классификаторов TAN Bayes на каком-то другом языке, который можно перевести на python?


Существующие пакеты, которые я знаю, но найдены неуместными,

  • milk, который поддерживает классификацию, но не с байесовскими классификаторами (и я defitinetly нуждаются в вероятности для классификации и неопределенных функций)
  • pebl, который только структурирует обучение
  • scikit-learn, который узнает только наивные классификаторы Байеса.
  • OpenBayes, который только немного изменился, поскольку кто-то портировал его с numarray на numpy, а документация пренебрежимо мала.
  • libpgm, который утверждает, что поддерживает даже другой набор вещей. Согласно основной документации, это вывод, структура и изучение параметров. Кроме того, нет никаких методов для точного вывода.
  • Reverend утверждает, что является "байесовским классификатором", имеет незначительную документацию и, глядя на исходный код, я приведу к выводу, что это в основном классификатор спама, в соответствии с Робинсоном и аналогичными методами, а не байесовский классификатор.
  • eBay bayesian Belief Networks позволяет создавать общие байесовские сети и реализовывать на них вывод (как точный, так и приблизительный), что означает, что его можно использовать для построения TAN, но там нет алгоритма обучения, а способ создания BN из функций означает, что внедрение параметров обучения сложнее, чем может быть для гипотетической различной реализации.
4b9b3361

Ответ 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 имеет модуль Random Forest: 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 p >

Дискретные наивные модели Байеса могут использоваться для обработки крупномасштабного текста проблемы классификации, для которых полный набор учебных материалов не подходит в памяти. Чтобы обрабатывать этот случай как MultinomialNB, так и BernoulliNB выставить метод partial_fit, который может использоваться пошагово. с другими классификаторами, как показано в разделе "Внеуровневая классификация" текстовых документов.

Ответ 2

Я тоже был смущен тем, как делать точный вывод с помощью 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)

Чтобы получить пример работы, вот файл данных (я заменил None на null и сохранен как .json).

Я знаю, что это довольно поздно для игры, но это был лучший пост, который я нашел при поиске ресурса для байесовских сетей с Python. Я думал, что отвечу, если кто-то еще это ищет. (Извините, прокомментировал бы, но просто подписался на SO, чтобы ответить на это, и rep недостаточно высок.)

Ответ 3

R bnlearn имеет реализации как для Naive Bayes, так и для классификаторов Naive Bayes с расширением дерева. Вы можете использовать rpy2 для их переноса на Python.

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

Ответ 4

Кажется, что еще нет.

Ближайшей вещью в настоящее время является реализация eBay с открытым исходным кодом bayesian сетей веры. Он реализует логический вывод (два точных способа и приблизительный), что означает, что его можно использовать для создания TAN. Пример (на данный момент еще уродливый кусок кода спагетти), который можно найти в моем репозитории open20q.

  • Преимущества:
    • Это работает. То есть, у меня теперь есть реализация вывода TAN, основанная на bayesian умозаключении сети.
    • В соответствии с лицензиями типа BSD версии Apache 2.0 и 3-clause соответственно можно объединить код bayesian и libpgm, чтобы попытайтесь получить вывод и научиться работать.
  • Недостатки:
    • В bayesian нет никакого обучения. Попытка сочетать что-то вроде libpgm обучения с классами bayesian и выводами будет проблемой.
    • Тем более, что bayesian предполагает, что узлы задаются факторами, которые являются фиксированными функциями python. Для изучения параметров требуется некоторый код обертывания, позволяющий настраивать вероятности.
    • bayesian записывается в чистом питоне, используя dicts и т.д. в качестве базовых структур, не используя каких-либо ускорений numpy, pandas или подобных пакетов, которые могут принести, и поэтому довольно медленны даже для крошечного примера я построить.

Ответ 5

Я знаю это немного поздно в тот же день, но интересный для вас пакет Octave forge NaN. Одним из классификаторов в этом пакете является расширенный байесовский классификатор Naive. Код GPL, поэтому вы можете легко перенести его на Python.