В настоящее время я работаю над проблемой классификации изображений с использованием байесовских сетей. Я пробовал использовать 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 строками. Если вы хотите попробовать воспроизвести результат.