Изучение и использование дополненных байесовских классификаторов в 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 из функций означает, что внедрение параметров обучения сложнее, чем может быть для гипотетической различной реализации.
Ответы
Ответ 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.