Prédiction d'une variable continue à l'aide du package «bnlearn» dans R

8

J'utilise le paquet bnlearn en R pour apprendre la structure de mon réseau bayésien et ses paramètres. Ce que je veux faire, c'est "prédire" la valeur d'un nœud étant donné la valeur des autres nœuds comme preuve (évidemment, à l'exception du nœud dont nous prédisons les valeurs).

J'ai des variables continues.

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

Maintenant, ce code fonctionne bien et donne un tableau dans lequel vous pouvez voir que les valeurs prédites pour le nœud C sont exactement les mêmes que la valeur d'origine du nœud C dans l'ensemble de test.

Je ne comprends pas la raison de cela, quelqu'un pourrait-il l'expliquer?

Je sais, je fournis un ensemble de test complet qui contient déjà la valeur du nœud C. Mais si je donne les données d'autres colonnes, cela donne une erreur. J'ai donc essayé une alternative consistant à mettre d'autres valeurs à 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

Cette approche est-elle mauvaise? (L'utilisation de "NA" n'est pas autorisée.)

user2698178
la source

Réponses:

6

Pourquoi utilisez-vous tablepour comparer la sortie? Utiliser cbindpour mettre côte à côte les valeurs réelles et prédites montre que les prédictions ne sont pas les mêmes que les réelles et vous pouvez calculer des mesures de précision standard pour quantifier le degré de divergence.

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

Comparer le réel et le prévu:

> 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

Mesurer la précision de la prédiction:

> 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
la source
J'obtiens une erreur Erreur dans is.constant (y): l'objet (list) ne peut pas être contraint à taper 'double' Dans pred = prédire (ajusté $ C, test.set) Une idée, pourquoi?
discipulus
@lovedynasty Sur quelle ligne obtenez-vous cette erreur?
tchakravarty
En ligne, prédire ($ C ajusté, test.set)
discipulus
@lovedynasty Vous devrez publier un exemple reproductible complet avec vos données pour diagnostiquer. Je suppose que l'exemple ci-dessus fonctionne bien.
tchakravarty
1
@lovedynasty L'interface de bnlearn:::predict.bn.fitsemble avoir changé. J'ai mis à jour mon code pour tenir compte de ce changement.
tchakravarty
0

Pour les deux ensembles prédits que vous avez proposés (avec les valeurs d'origine et les zéros), j'ai trouvé la même sortie dans R.

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

Cela montre que les valeurs de C ne sont pas pertinentes. De plus, test.set$cvous propose:

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

qui est intrinsèquement différent de la sortie prévue. Cela m'amène à croire que votre code est en fait correct.

Jovaz0r
la source
0

L'équivalent pour le cas discret se produit (impossibilité de mettre la variable cible à zéro). Dans ce cas, procédez comme suit:

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