Previsão de variável contínua usando o pacote "bnlearn" em R

8

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.)

user2698178
fonte

Respostas:

6

Por que você está usando tablepara comparar a saída? Usar cbindpara colocar os valores reais e previstos lado a lado mostra que as previsões não são iguais às reais, e você pode calcular métricas de precisão padrão para quantificar o grau em que divergem.

library(bnlearn)                       # Load the package in R
library(forecast)

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
cbind(pred, test.set[, "C"])           # compare the actual and predicted
accuracy(f = pred, x = test.set[, "C"])

Comparando o real e o previsto:

> cbind(predicted = pred, actual = test.set[, "C"])           
       predicted    actual
 [1,]  3.5749952  3.952410
 [2,]  0.7434548  1.443177
 [3,]  5.1731669  5.924198
 [4,] 10.0840800 10.296560
 [5,] 12.3966908 12.268170
 [6,]  9.1834888  9.725431
 [7,]  6.8067145  5.625797
 [8,]  9.9246630  9.597326
 [9,]  5.9426798  6.503896
[10,] 16.0056136 16.037176

Medição da precisão da previsão:

> accuracy(f = pred, x = test.set[, "C"])
                ME      RMSE       MAE      MPE     MAPE
Test set 0.1538594 0.5804431 0.4812143 6.172352 11.26223
tchakravarty
fonte
Eu recebo um erro O erro no objeto is.constant (y): (list) não pode ser coagido a digitar 'double' Em pred = prediz ($ C, test.set) Alguma idéia, por que?
Discipulus
@lovedynasty Em que linha você recebe esse erro?
Tchakravarty
Em conformidade, prever (equipado $ C, test.set)
discipulus
@lovedynasty Você terá que postar um exemplo completo de reproduzível com seus dados para diagnosticar. Estou assumindo que o exemplo acima funciona bem.
Tchakravarty
1
@lovedynasty A interface do bnlearn:::predict.bn.fitparece ter sido alterada. Atualizei meu código para considerar essa alteração.
Tchakravarty # 8/15
0

Para os dois conjuntos previstos que você propôs (com os valores originais e zeros), encontrei a mesma saída em R.

[1]  3.5749952  0.7434548  5.1731669 10.0840800 12.3966908  9.1834888  6.8067145
[8]  9.9246630  5.9426798 16.0056136

Isso mostra que os valores de C são irrelevantes. Além disso, test.set$cfornece:

[1]  3.952410  1.443177  5.924198 10.296560 12.268170  9.725431  5.625797  9.597326
[9]  6.503896 16.037176

que é inerentemente diferente da saída prevista. Isso me leva a acreditar que seu código está de fato correto.

Jovaz0r
fonte
0

O equivalente para o caso discreto ocorre (incapacidade de definir a variável de destino como zero). Nesse caso, faça o seguinte:

test.set\$TARGET<-as.factor(0)  
levels(test.set\$TARGET) <- c(level1,level2,level3...)
mik
fonte