Vorhersage der kontinuierlichen Variablen mit dem Paket „bnlearn“ in R.


8

Ich verwende das bnlearn-Paket in R, um die Struktur meines Bayes'schen Netzwerks und seine Parameter zu lernen. Was ich tun möchte, ist, den Wert eines Knotens anhand des Werts anderer Knoten als Beweis "vorherzusagen" (offensichtlich mit Ausnahme des Knotens, dessen Werte wir vorhersagen).

Ich habe kontinuierliche Variablen.

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

Dieser Code funktioniert nun gut und enthält eine Tabelle, in der Sie sehen können, dass die vorhergesagten Werte für Knoten C genau mit dem ursprünglichen Wert von Knoten C im Testsatz übereinstimmen.

Ich verstehe den Grund dafür nicht, könnte jemand es bitte erklären?

Ich weiß, ich stelle die gesamte df des Testsatzes bereit, der bereits den Wert von Knoten C enthält. Aber wenn ich die Daten anderer Spalten gebe, gibt es einen Fehler. Also habe ich eine Alternative versucht, andere Werte auf 0 zu setzen.

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

Ist dieser Ansatz falsch? (Die Verwendung von "NA" ist nicht zulässig.)

Antworten:


6

Warum tablevergleichen Sie die Ausgabe? Wenn Sie cbinddie tatsächlichen und vorhergesagten Werte nebeneinander stellen, werden die Vorhersagen nicht mit den tatsächlichen Werten identisch, und Sie können Standardgenauigkeitsmetriken berechnen, um den Grad ihrer Abweichung zu quantifizieren.

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

Vergleich der tatsächlichen und vorhergesagten:

> 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

Messgenauigkeit der Vorhersage:

> accuracy(f = pred, x = test.set[, "C"])
                ME      RMSE       MAE      MPE     MAPE
Test set 0.1538594 0.5804431 0.4812143 6.172352 11.26223

Ich erhalte eine Fehlermeldung Fehler in is.constant (y): (Listen-) Objekt kann nicht zum Typ 'double' gezwungen werden.
Discipulus

@lovedynasty Auf welcher Zeile wird dieser Fehler angezeigt?
Tchakravarty

Entsprechend prognostizieren (abgepasst $ C, test.set)
discipulus

@lovedynasty Sie müssen ein vollständiges Reproduktionsbeispiel mit Ihren Daten zur Diagnose veröffentlichen. Ich gehe davon aus, dass das obige Beispiel gut läuft.
Tchakravarty

1
@lovedynasty Die Oberfläche von bnlearn:::predict.bn.fitscheint sich geändert zu haben. Ich habe meinen Code aktualisiert, um diese Änderung zu berücksichtigen.
Tchakravarty

0

Für beide von Ihnen vorgeschlagenen vorhergesagten Mengen (sowohl mit den Originalwerten als auch mit den Nullen) habe ich in R dieselbe Ausgabe gefunden.

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

Dies zeigt, dass die Werte von C irrelevant sind. Darüber hinaus test.set$cbietet Ihnen:

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

Dies unterscheidet sich von Natur aus von der vorhergesagten Ausgabe. Dies lässt mich glauben, dass Ihr Code tatsächlich korrekt ist.


0

Das Äquivalent für den diskreten Fall tritt auf (Unfähigkeit, die Zielvariable auf Null zu setzen). In diesem Fall gehen Sie wie folgt vor:

test.set\$TARGET<-as.factor(0)  
levels(test.set\$TARGET) <- c(level1,level2,level3...)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.