Байесовские сети: изучение структуры в Python происходит очень медленно по сравнению с R - PullRequest
0 голосов
/ 30 мая 2020

В настоящее время я работаю над проблемой классификации изображений с использованием байесовских сетей. Я пробовал использовать pomegranate, pgmpy и bnlearn. Мой набор данных содержит более 200000 изображений, на которых я выполняю некоторый алгоритм извлечения признаков и получаю вектор признаков размером 1026.

pgmpy

from pgmpy.models import BayesianModel
from pgmpy.estimators import HillClimbSearch, BicScore, K2Score
est = HillClimbSearch(feature_df, scoring_method=BicScore(feature_df[:20]))
best_model = est.estimate()
edges = best_model.edges()
model = BayesianModel(edges)

гранат

from pomegranate import *
model = BayesianNetwork.from_samples(feature_df[:20], algorithm='exact')

bnlearn

library(bnlearn)
df <- read.csv('conv_encoded_images.csv')
df$Age = as.numeric(df$Age)
res <- hc(df)
model <- bn.fit(res,data = df)

Программа, написанная на bnlearn в R, завершает работу за пару минут, в то время как pgmpy работает часами, а гранат зависает через несколько минут. Из моего кода видно, что я даю первые 20 строк для обучения в программах pgmpy и pomegranate, а bnlearn занимает весь фрейм данных. Поскольку всю предварительную обработку изображений и извлечение функций я выполняю в python, мне сложно переключаться между R и python для обучения.

Мои данные содержат непрерывные значения от 0 до 1. Я также пробовал дискретизировать данные до 0 и 1, что не помогло решить проблему.

Могу ли я как-нибудь ускорить обучение в этих python пакетах, или я делаю что-то не так в своем коде?

Заранее спасибо за любую помощь.

Изменить:

https://drive.google.com/file/d/1HbAqDQ6Uv1417zPFMgWBInC7-gz233j2/view?usp=sharing

Это набор данных с 300 столбцами и ~ 40000 строками. Если вы хотите попробовать воспроизвести результат.

...