Dự đoán biến liên tục bằng cách sử dụng gói của bnlearn trên R


8

Tôi sử dụng gói bnlearn trong R để tìm hiểu cấu trúc của Mạng Bayes và các tham số của nó. Điều tôi muốn làm là "dự đoán" giá trị của một nút được đưa ra giá trị của các nút khác làm bằng chứng (rõ ràng, ngoại trừ nút có giá trị mà chúng ta dự đoán).

Tôi có các biến liên tục.

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

Bây giờ, mã này hoạt động tốt và đưa ra một bảng trong đó bạn có thể thấy rằng các giá trị dự đoán cho nút C hoàn toàn giống với giá trị ban đầu của nút C trong tập kiểm tra.

Tôi không hiểu lý do cho điều đó, ai đó có thể vui lòng giải thích nó?

Tôi biết, tôi đang cung cấp toàn bộ df của tập kiểm tra đã có giá trị của nút C trong đó. Nhưng nếu tôi cung cấp dữ liệu của các cột khác, nó sẽ báo lỗi. Vì vậy, tôi đã thử một cách khác để đưa các giá trị khác về 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

Cách tiếp cận này có sai không? (Không được phép sử dụng "NA".)

Câu trả lời:


6

Tại sao bạn sử dụng tableđể so sánh đầu ra? Sử dụng cbindđể đặt các giá trị thực tế và dự đoán cạnh nhau cho thấy các dự đoán không giống với thực tế và bạn có thể tính toán các số liệu chính xác tiêu chuẩn để định lượng mức độ mà chúng phân kỳ.

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

So sánh thực tế và dự đoán:

> 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

Đo lường độ chính xác của dự đoán:

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

Tôi gặp lỗi Lỗi trong is.constant (y): đối tượng (danh sách) không thể bị ép buộc gõ 'double' Trong dự đoán = dự đoán (trang bị $ C, test.set) Bất kỳ ý tưởng nào, tại sao?
discipulus

@loved triều Dòng nào bạn nhận được lỗi đó?
tchakravarty

Phù hợp, dự đoán (lắp $ C, test.set)
discipulus

@loved triều Bạn sẽ phải đăng một ví dụ sinh sản hoàn chỉnh với dữ liệu của bạn để chẩn đoán. Tôi giả sử rằng ví dụ trên chạy tốt.
tchakravarty

1
@loved triều Giao diện bnlearn:::predict.bn.fitdường như đã thay đổi. Tôi đã cập nhật mã của mình để giải thích cho sự thay đổi đó.
tchakravarty

0

Đối với cả các bộ dự đoán mà bạn đề xuất (với cả giá trị ban đầu và số không) tôi đã tìm thấy cùng một đầu ra trong R.

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

Điều này cho thấy các giá trị của C không liên quan. Hơn nữa, test.set$ccung cấp cho bạn:

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

vốn đã khác với sản lượng dự đoán. Điều này khiến tôi tin rằng mã của bạn trong thực tế là chính xác.


0

Tương đương cho trường hợp riêng biệt xảy ra (không có khả năng đặt biến mục tiêu thành không). Trong trường hợp này, hãy làm như sau:

test.set\$TARGET<-as.factor(0)  
levels(test.set\$TARGET) <- c(level1,level2,level3...)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.