我已经在bnlearn R包中学习并安装了贝叶斯网络,我希望预测它是“事件”节点值。
fl="data/discrete_kdd_10.txt"
h=TRUE
dtbl1 = read.csv(file=fl, head=h, sep=",")
net=hc(dtbl1)
fitted=bn.fit(net,dtbl1)
我想根据存储在另一个文件中的证据预测“event”节点的值,该文件与用于学习的文件具有相同的结构。
fileName="data/dcmp.txt"
dtbl2 = read.csv(file=fileName, head=h, sep=",")
predict(fitted,"event",dtbl2)
然而,预测失败了
Error in check.data(data) : variable duration must have at least two levels.
我不明白为什么对证据data.frame中的变量级别有任何限制。
dtbl2
data.frame只包含几行,每个场景对应一个我要预测“事件”值的场景。
我知道我可以使用cpquery,但我也希望将predict
函数用于具有混合变量(离散和连续)的网络。我还没有找到如何在cpqery中使用连续变量的证据。
有人可以解释一下我对predict
函数的错误,我该怎么做?
提前谢谢!
答案 0 :(得分:2)
问题在于阅读
中的证据data.framefileName="data/dcmp.txt"
dtbl2 = read.csv(file=fileName, head=h, sep=",")
predict(fitted,"event",dtbl2)
导致分类变量为具有不同级别数的因子(原始训练集的级别子集)。
我使用以下代码来解决此问题。
for(i in 1:dim(dtbl2)[2]){
dtbl2[[i]] = factor(dtbl2[[i]],levels = levels(dtbl1[[i]]))
}
顺便说一句,bnlearn包确实适合具有混合变量的模型,并且还提供了预测函数。