Eu uso o pacote bnlearn em R para aprender a estrutura da minha rede bayesiana e seus parâmetros. O que eu quero fazer é "prever" o valor de um nó, dado o valor de outros nós como evidência (obviamente, com exceção do nó cujos valores estamos prevendo).
Eu tenho variáveis contínuas.
library(bnlearn) # Load the package in R
data(gaussian.test)
training.set = gaussian.test[1:4000, ] # This is training set to learn the parameters
test.set = gaussian.test[4001:4010, ] # This is test set to give as evidence
res = hc(training.set) # learn BN structure on training set data
fitted = bn.fit(res, training.set) # learning of parameters
pred = predict(fitted$C, test.set) # predicts the value of node C given test set
table(pred, test.set[, "C"]) # compares the predicted value as original
Agora, esse código funciona bem e fornece uma tabela na qual é possível ver que os valores previstos para o nó C são exatamente iguais ao valor original do nó C no conjunto de testes.
Eu não entendo o motivo disso, alguém poderia explicar isso?
Eu sei, estou fornecendo df inteiro do conjunto de teste que já possui o valor do nó C. Mas se eu der os dados de outras colunas, isso dá um erro. Então, tentei uma alternativa de colocar outros valores em 0.
test.set$C = 0 # To not give the original value of node C as evidence
pred = predict(fitted$C, test.set) # predicts the value of node C given test set
table(pred, test.set[, "C"]) # compares the predicted value as original
Essa abordagem está errada? (O uso de "NA" não é permitido.)
fonte
bnlearn:::predict.bn.fit
parece ter sido alterada. Atualizei meu código para considerar essa alteração.Para os dois conjuntos previstos que você propôs (com os valores originais e zeros), encontrei a mesma saída em R.
Isso mostra que os valores de C são irrelevantes. Além disso,
test.set$c
fornece:que é inerentemente diferente da saída prevista. Isso me leva a acreditar que seu código está de fato correto.
fonte
O equivalente para o caso discreto ocorre (incapacidade de definir a variável de destino como zero). Nesse caso, faça o seguinte:
fonte