Rの「bnlearn」パッケージを使用した連続変数の予測


8

Rでbnlearnパッケージを使用して、ベイジアンネットワークの構造とそのパラメーターを学習します。私がやりたいことは、証拠として他のノードの値を与えられたノードの値を「予測」することです(当然、予測している値のノードを除いて)。

連続変数があります。

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

これで、このコードはうまく機能し、ノードCの予測値がテストセットのノードCの元の値とまったく同じであることを確認できる表が表示されます。

その理由がわかりません。誰か教えていただけませんか?

私は、ノードCの値が既に含まれているテストセットのdf全体を提供しています。しかし、他の列のデータを指定すると、エラーが発生します。それで、私は他の値を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

このアプローチは間違っていますか?(「NA」は使用できません。)

回答:


6

なぜtable出力を比較するために使用していますか?を使用cbindして実際の値と予測値を並べて表示すると、予測が実際の値と同じではないことがわかります。標準的な精度のメトリックを計算して、それらがどの程度逸脱しているかを定量化できます。

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

実際と予測の比較:

> 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

予測の測定精度:

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

is.constant(y)でエラーが発生しました:(リスト)オブジェクトを強制的に 'double'型にできませんIn pred = predict(fitted $ C、test.set)任意のアイデア、なぜですか?
弟子

@lovedynastyどの行でそのエラーが発生しますか?
tchakravarty

並んで、predict(fitted $ C、test.set)
discipulus

@lovedynasty診断するには、データを含む完全な再現例を投稿する必要があります。上記の例は問題なく動作すると想定しています。
tchakravarty

1
@lovedynastyのインターフェースbnlearn:::predict.bn.fitが変更されたようです。その変更に対応するためにコードを更新しました。
tchakravarty

0

提案した両方の予測セット(元の値とゼロの両方)について、Rで同じ出力が見つかりました。

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

これは、Cの値が無関係であることを示しています。さらに、以下をtest.set$c提供します。

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

これは、予測される出力とは本質的に異なります。これは、あなたのコードが実際に正しいと私に信じさせます。


0

離散ケースと同等のことが発生します(ターゲット変数をゼロに設定できない)。この場合、以下を実行します。

test.set\$TARGET<-as.factor(0)  
levels(test.set\$TARGET) <- c(level1,level2,level3...)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.