Prediksi variabel kontinu menggunakan paket "bnlearn" di R

8

Saya menggunakan paket bnlearn di R untuk mempelajari struktur Jaringan Bayesian saya dan parameternya. Apa yang ingin saya lakukan adalah untuk "memprediksi" nilai dari sebuah simpul yang diberi nilai dari simpul lain sebagai bukti (jelas, dengan pengecualian dari simpul yang nilainya kita prediksi).

Saya memiliki variabel kontinu.

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

Sekarang, kode ini berfungsi dengan baik dan memberikan tabel di mana Anda dapat melihat bahwa nilai yang diprediksi untuk simpul C persis sama dengan nilai asli simpul C dalam set uji.

Saya tidak mengerti alasannya, dapatkah seseorang menjelaskannya?

Saya tahu, saya menyediakan seluruh df set tes yang sudah memiliki nilai simpul C di dalamnya. Tetapi jika saya memberikan data kolom lain, itu memberikan kesalahan. Jadi, saya mencoba alternatif untuk meletakkan nilai lain ke 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

Apakah pendekatan ini salah? (Menggunakan "NA" tidak diperbolehkan.)

pengguna2698178
sumber

Jawaban:

6

Mengapa Anda menggunakan tableuntuk membandingkan output? Menggunakan cbinduntuk menempatkan nilai aktual dan prediksi berdampingan menunjukkan bahwa prediksi tidak sama dengan yang sebenarnya, dan Anda dapat menghitung metrik akurasi standar untuk mengukur sejauh mana mereka berbeda.

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

Membandingkan yang sebenarnya dan yang diperkirakan:

> 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

Mengukur akurasi prediksi:

> 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
sumber
Saya mendapatkan kesalahan Kesalahan dalam is.constant (y): (daftar) objek tidak dapat dipaksa untuk mengetik 'ganda' Dalam pred = prediksi (dilengkapi $ C, test.set) Ada ide, mengapa?
Disiplin
@lovedynasty Baris apa yang membuat Anda mengaktifkan kesalahan itu?
tchakravarty
Sejalan, prediksi (pas $ C, test.set)
Disiplin
@lovedynasty Anda harus memposting contoh lengkap lengkap dengan data Anda untuk didiagnosis. Saya berasumsi bahwa contoh di atas berjalan dengan baik.
tchakravarty
1
@lovedynasty Antarmuka bnlearn:::predict.bn.fittampaknya telah berubah. Saya telah memperbarui kode saya ke akun untuk perubahan itu.
tchakravarty
0

Untuk kedua set prediksi yang Anda usulkan (dengan nilai asli dan nol) saya menemukan output yang sama di R.

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

Ini menunjukkan bahwa nilai-nilai C tidak relevan. Selanjutnya, test.set$cmemberi Anda:

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

yang secara inheren berbeda dari output yang diprediksi. Ini membuat saya percaya bahwa kode Anda sebenarnya benar.

Jovaz0r
sumber
0

Setara dengan kasus diskrit terjadi (ketidakmampuan untuk mengatur variabel target ke nol). Dalam hal ini lakukan hal berikut:

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