持久的 R 模型暴露为 Web 服务 returns 错误答案

Persisted R Model exposed as Web Service returns wrong answer

我正在努力使用 Plumber 和 Swagger 将 R 机器学习分类模型公开为 Web 服务。我训练了一个模型并将其保存为 "j48.model.rda"。我现在正在将模型加载到名为 "myFile.R" 的文件中。此文件包含以下 R 代码:

library(rJava)
jsDirData <- "C:/AA Research/Playpen/Data"
setwd(jsDirData)

#Load the saved model
load(file="j48.model.rda", envir = parent.frame(), verbose = FALSE) 

#' @param naasra90th:numeric The 90th Percentile Naasra value for the segment
#' @param rut90th:numeric The 90th Percentile Rut Depth for the segment
#' @param surfAge:numeric The surface age of the segment, in years (fractions are OK)
#' @param rutRate90th:numeric The rut rate on the 90th Percentile Rut depth (mm/year)
#' @param maintCount:int The number of maintenance acions
#' @get /getTreatment
#' @html
#' @response 200 Returns the treatment class (ThinAC or none) prediction from the j48 model;
#' @default  Bonk!
getTreatment <- function(naasra90th, rut90th, surfAge, rutRate90th, maintCount) {
  xVals <- list(naasra90th = naasra90th, rut90th = rut90th, surfAge = surfAge, 
                rutRate90th = rutRate90th, maintCount = maintCount)
  nData <- as.data.frame(xVals)
  pred <- predict(j48.model,newdata = nData)
  res <- as.character(pred)
  return(res)
}

t <- getTreatment(50,8.8,5,0.3,0)  #should return "none"
t    #"none" Correct!

t <- getTreatment(888,888,888,888,888) #should return "ThinAC"
t    #"ThinAC" Correct!

从最后几行可以看出,当我在 R-Studio 中直接调用该函数时,它给出了正确的分类。但现在我尝试通过 Plumber/Swagger 网络服务调用此方法,如下所示:

library(plumber)

jsDirData <- "C:/AA Research/Playpen/Data"
setwd(jsDirData)

r <- plumb("myfile.R")
r$run(port=8000)

当我 运行 这段代码时,Swagger 打开浏览器并正确显示 API。但是,当我使用 "Try It" 按钮测试 API 时,无论我将什么参数传递给该方法,它总是显示结果为 "none"。例如,如果我在上面的第二个方法调用中输入相同的一组参数(即所有参数均为 888),那么它应该 returns "none" return [=26] =].

我做错了什么?

我相信您从 swagger 调用中收到的值仍然是字符 class,因为管道工不会对查询字符串参数进行任何转换。

在执行 as.data.frame 之前,尝试更改 xVals

中值的 class
xVals <- lapply(xVals, as.numeric)

为了证实这个假设,你可以在 as.data.frame 之后插入一个 browser() 并用 lapply(nData, class) 检查 nData 中值的 class。

祝你好运