持久的 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。
祝你好运
我正在努力使用 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
xVals <- lapply(xVals, as.numeric)
为了证实这个假设,你可以在 as.data.frame
之后插入一个 browser()
并用 lapply(nData, class)
检查 nData
中值的 class。
祝你好运