Predicción de variable continua utilizando el paquete "bnlearn" en R

8

Utilizo el paquete bnlearn en R para aprender la estructura de mi red bayesiana y sus parámetros. Lo que quiero hacer es "predecir" el valor de un nodo dado el valor de otros nodos como evidencia (obviamente, con la excepción del nodo cuyos valores estamos prediciendo).

Tengo variables continuas

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

Ahora, este código funciona bien y proporciona una tabla en la que puede ver que los valores pronosticados para el nodo C son exactamente iguales al valor original del nodo C en el conjunto de prueba.

No entiendo la razón de eso, ¿alguien podría explicarlo?

Lo sé, estoy proporcionando df completo del conjunto de pruebas que ya tiene el valor del nodo C en él. Pero si doy los datos de otras columnas, da un error. Entonces, probé una alternativa de poner otros valores a 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

¿Es este enfoque incorrecto? (El uso de "NA" no está permitido).

usuario2698178
fuente

Respuestas:

6

¿Por qué estás usando tablepara comparar la salida? El uso cbindpara poner los valores reales y pronosticados uno al lado del otro muestra que las predicciones no son las mismas que las reales, y puede calcular métricas de precisión estándar para cuantificar el grado en que divergen.

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 lo real y lo 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

Precisión de medición de predicción:

> 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
fuente
Me sale un error Error en is.constant (y): el objeto (list) no puede ser forzado a escribir 'double' en pred = predict (ajustado $ C, test.set) Alguna idea, ¿por qué?
discipulus
@lovedynasty ¿En qué línea aparece ese error?
tchakravarty
En línea, predecir (ajustado $ C, test.set)
discipulus
@lovedynasty Deberá publicar un ejemplo completo de reproducbile con sus datos para diagnosticar. Supongo que el ejemplo anterior funciona bien.
tchakravarty
1
@lovedynasty La interfaz de bnlearn:::predict.bn.fitparece haber cambiado. He actualizado mi código para dar cuenta de ese cambio.
tchakravarty
0

Para ambos conjuntos predichos que propuso (tanto con los valores originales como con ceros) encontré el mismo resultado en R.

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

Esto muestra que los valores de C son irrelevantes. Además, test.set$cte proporciona:

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

que es inherentemente diferente del resultado previsto. Esto me lleva a creer que su código es correcto.

Jovaz0r
fuente
0

Se produce el equivalente para el caso discreto (incapacidad para establecer la variable objetivo en cero). En este caso, haga lo siguiente:

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