我正在使用RMOA
包在R
中实现一个带有保留集评估的Hoeffding Tree流分类器。
一切都训练得很好,除了当我尝试从保留的测试流中评估我的模型时,我遇到了以下错误信息:
在UseMethod(“predict”)中出错:没有适用于类为”c(‘HoeffdingTree’, ‘MOA_classifier’, ‘MOA_model’)”对象的’predict’方法
我查看了这个问题的答案,问题可能源于predict()
方法同时存在于stats
和RMOA
包中。我尝试使用::
符号来指定使用哪个包,但似乎无法指向RMOA predict()
。我也尝试完全卸载stats
,但这并没有帮助。
有谁知道如何直接指向RMOA
的predict()
方法,或者我的问题是否由其他原因引起?
我的R代码如下。我目前只是在流式传输iris数据集,并提取前30个流项目用于保留集评估。
holdout<-function(){ require("RMOA") #初始化流 stream<-datastream_dataframe(iris) test<-stream$get_points(n=30) test<-datastream_dataframe(test) #指定模型 mymodel<-HoeffdingTree(numericEstimator = "GaussianNumericAttributeClassObserver") #记录训练执行时间 start_time<-Sys.time() while(!stream$finished) { mymodel <<- trainMOA(model=mymodel, formula = Species ~ Sepal.Length+Sepal.Width+Petal.Length+Petal.Width, data=stream) } end_time<-Sys.time() time_taken <- end_time - start_time cat("训练完成。耗时:", time_taken) #用于存储保留集流元素的单个准确性结果的空向量 accuracies<-c() #记录保留集评估的执行时间 start_time<-Sys.time() while(!test$finished) { samp<-test$get_points(n=1) pred <- predict(mymodel, samp, type="response") } end_time<-Sys.time() time_taken <- end_time - start_time cat("训练完成。耗时:", time_taken)}
回答:
RMOA包中的predict方法是一个内部变量,你可以这样调用它:
RMOA:::predict.MOA_trainedmodel
完整示例:
library(RMOA)data(iris)stream <- datastream_dataframe(iris)test <- stream$get_points(n = 30)test <- datastream_dataframe(test)mymodel <- HoeffdingTree(numericEstimator = "GaussianNumericAttributeClassObserver")mymodel <- trainMOA(model = mymodel, formula = Species ~ Sepal.Length+Sepal.Width+Petal.Length+Petal.Width, data = stream)
在我的情况下,predict函数没有被屏蔽(如果它没有被导出,这很奇怪):
pred1 <- predict(mymodel, iris, type = "response")
但如果它被屏蔽了,我可以使用:
pred2 <- RMOA:::predict.MOA_trainedmodel(mymodel, iris, type = "response")
结果将是相同的:
all.equal(pred1, pred2)#outputTRUE
我检查了RMOA的NAMESPACE,predict函数是被导出的,但不知为何
RMOA::predict.MOA_trainedmodel
会导致
错误:’predict.MOA_trainedmodel’不是’namespace:RMOA’中导出的对象
而
RMOA:::predict.MOA_trainedmodel
则不会