Байесовские сети: ситуация с разной точностью

У меня проблема с байесовскими сетями, и я надеюсь найти ответ. Я попытаюсь разделить мой вопрос, чтобы улучшить ваше понимание!

ЦЕЛЬ: После обучения моей модели, учитывая переменные X (читай матрицу A), я хочу предсказать переменные Y (читай матрицу B). Как пример:

Учитывая доказательства в переменных A,B,C, я хочу предсказать переменные D,E,F

По этому вы можете видеть, что я ищу многовариантное предсказание!

ПРОБЛЕМА ИЛИ КАТАСТРОФА: В настоящее время я использую пакет bnlearn в R, и проблема в том, что: худшие модели (пустой и случайный граф) иногда имеют лучшую точность, чем моя лучшая модель (полученная из данных), или выглядят очень близко к моя лучшая модель! и что еще хуже, тестовый набор находится внутри моего тренировочного набора, так что технически моя лучшая модель должна выполнить ~100%, а этого не происходит!

Я хочу знать, есть ли какая-либо математическая ошибка в моей реализации (я объяснил шаг за шагом в коде) и как я могу объяснить эту ситуацию...

PS1: я знаю, что необходимо разделить данные, но в моем реальном проекте мне не хватает строк, и изменение набора данных (размера), вероятно, изменит окончательную модель

PS2: мультиваревая точность отсутствует в пакете, поэтому была создана вручную

Вот мой код с комментариями:

library(bnlearn)
# Dataframe
al <- alarm

# Nodes that I'm going to use as evidence to my models
nodeEvid <- names(al)[-c(30,31,32,33,34,35,36,37)]

# Nodes that I'm going to use as events to my models
nodeEvnt <- names(al)[c(30,31,32,33,34,35,36,37)]

## Best Model - Using all my data to create the arcs
bn_k2 <- tabu(x = al, score = 'k2')

## Worst Models
# Empty model
bn_eg <- empty.graph(names(al))

# Random model
bn_rd <- random.graph(names(al))

# Fitting the models ...
modelsBN = list(bn.fit(x = bn_k2, data = al), 
bn.fit(x = bn_eg, data = al),
bn.fit(x = bn_rd, data = al))

# Seed
set.seed(7)

# Selecting randomly lines to create our dTest
trainRows <- sample(1:nrow(al),as.integer(nrow(al)*0.30) , replace=F)

# Dataframe for test
dTest <- al[trainRows,]
# ACCURACY - CPDIST TO MULTI-VAR

# Dataframe to keep all the results in the end
accuracyCPD <- setNames(data.frame(matrix(ncol = length(nodeEvnt) + 1, nrow =     length(modelsBN))), c(nodeEvnt,"TOTAL MEAN ACCURACY BY MODEL"))

# Process to calculate ...
for (m in 1:length(modelsBN)){ # For every m bayesian model that I created
  # predCPD is a dataframe generated to keep the results to each sample run, I will explain more ahead...
  predCPD <- setNames(data.frame(matrix(ncol = length(nodeEvnt), nrow = nrow(dTest))), nodeEvnt)

  for (i in seq(nrow(dTest))){ # For i samples in my dTest
    #cpdist is a function that returns a dataframe of predictions based on conditional probability distribution from the model, with the rows being n value and the columns being
    # the nodeEvnt. So I will save his results in a dataframe called 'teste'
    teste <- cpdist(modelsBN[[m]], nodes = nodeEvnt, evidence = as.list(dTest[i, names(dTest) %in% nodeEvid]), n = 1000, method = "lw")
    # Here I use predCPD to calculate a % of how many times was returned the TRUE value/rows from my teste dataframe (tries from my model), this will be done to each variable 
    # from nodeEvnt
    for (j in 1:length(nodeEvnt)){ # Gerar media de acertos para j fatores bioticos
      predCPD[i,nodeEvnt[j]] <- sum(teste[nodeEvnt[j]] == as.character(dTest[i,nodeEvnt[j]]), na.rm = TRUE)/nrow(teste)
    }
  }

  # Here I do a 'Mean from means' (because predCPD is technically a mean) after my dTest is done, so accCPD have the results to that m model
  accCPD <- colMeans(predCPD, na.rm = TRUE)
  # Here I just multiply by 100 to put in the format 0 - 100 %
  for (j in 1:length(nodeEvnt)){
    accuracyCPD[m,nodeEvnt[j]] <- accCPD[nodeEvnt[j]]*100
  }
  # Here I do a mean from my target variables to save in "TOTAL MEAN ACCURACY BY MODEL"
  accuracyCPD[m,length(nodeEvnt) + 1] <- mean(accCPD)*100
}

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

0 ответов

Другие вопросы по тегам