8 votos

Predicción de variables continuas mediante el paquete "bnlearn" en R

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 da una tabla en la que se puede ver que los valores predichos para el nodo C son exactamente mismo que el valor original del nodo C en el conjunto de pruebas.

No entiendo el motivo, ¿alguien podría explicarlo?

Lo sé, estoy proporcionando todo el df 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. Por lo tanto, he intentado 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 un error este planteamiento? (El uso de "NA" no está permitido).

6voto

Jamie Brennan Puntos 86

¿Por qué utiliza table para comparar la salida? Utilizando cbind poner los valores reales y los predichos uno al lado del otro muestra que las predicciones no son las mismas que las reales, y se puede calcular una métrica de precisión estándar para cuantificar el grado de divergencia.

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"])

Comparación entre 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

Medir la precisión de la 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

0 votos

Obtengo un error Error en is.constant(y) : (list) object cannot be coerced to type 'double' En pred = predict(fitted$C, test.set) ¿Alguna idea, por qué?

0 votos

@lovedynasty ¿En qué línea te aparece ese error?

0 votos

En línea, predecir(fitted$C, test.set)

0voto

BinaryMage Puntos 175

Para los dos conjuntos de predicciones que propusiste (tanto con los valores originales como con los ceros) encontré la misma salida 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 demuestra que los valores de C son irrelevantes. Además, test.set$c le 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 intrínsecamente diferente del resultado previsto. Esto me lleva a creer que su código es, de hecho, correcto.

0voto

Pasha Puntos 160

Se produce el equivalente para el caso discreto (incapacidad de poner a cero la variable objetivo). En este caso haga lo siguiente:

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

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X