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.)
la source
bnlearn:::predict.bn.fit
semble avoir changé. J'ai mis à jour mon code pour tenir compte de ce changement.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.
Cela montre que les valeurs de C ne sont pas pertinentes. De plus,
test.set$c
vous propose:qui est intrinsèquement différent de la sortie prévue. Cela m'amène à croire que votre code est en fait correct.
la source
L'équivalent pour le cas discret se produit (impossibilité de mettre la variable cible à zéro). Dans ce cas, procédez comme suit:
la source