【发布时间】:2020-03-03 10:12:00
【问题描述】:
我开发了一个带有mlr3 包的graphlearner,我想在Rplumber 服务中发布它。但是,当我收到数据进行预测(JSON 格式的数据)时,graphlearner 无法识别数据,因为jsonlite 的fromJSON 函数无法推断出正确的类型(在其上学习了图表) .您对此有解决方案吗?有没有一种机制可以在预测阶段管理 mlr3 中的 JSON 数据?
学习步骤
library(mlr3)
imp_missind = po("missind")
imp_fct = po("imputenewlvl", param_vals =list(affect_columns = selector_type("factor")))
imp_num = po("imputehist", param_vals =list(affect_columns = selector_type("numeric")))
learner = lrn('regr.ranger')
graph = po("copy", 2) %>>%
gunion(list(imp_missind, imp_num %>>% imp_fct)) %>>%
po("featureunion") %>>%
po(learner)
t1 = tsk("boston_housing")
g1 = GraphLearner$new(graph)
g1$train(t1)
saveRDS(g1,'my-model')
Predction step : it works(模拟数据进行预测,移除目标 col)
data=t1$data()[1:1,-1]
model = readRDS('my-model')
model$predict_newdata(newdata=data)
预测步骤:不起作用(模拟 JSON 数据进行预测)
model = readRDS('my-model')
data = t1$data()[1:1,-1]
json = fromJSON(toJSON(data, na="string"))
model$predict_newdata(newdata=json)
和错误:
错误:无法 rbind 任务:类型与列不匹配:cmedv(数字!=整数)
更新可重现的示例
library(mlr3learners)
library(mlr3)
library(mlr3pipelines)
library(jsonlite)
imp_missind = po("missind")
imp_fct = po("imputenewlvl", param_vals =list(affect_columns = selector_type("factor")))
imp_num = po("imputehist", param_vals =list(affect_columns = selector_type("numeric")))
learner = lrn('regr.ranger')
graph = po("copy", 2) %>>%
gunion(list(imp_missind, imp_num %>>% imp_fct)) %>>%
po("featureunion") %>>%
po(learner)
task = tsk("boston_housing")
graphlearner = GraphLearner$new(graph)
#train model
graphlearner$train(task)
# create data to predict (juste one observation)
data= task$data()
data[1:1, chas := NA]
data = data[1:1,-1]
# look the the types of columns
str(data)
# predictin, this works fine
predict(graphlearner, data)
# simulate the case when json data is received
json_data = toJSON(data, na="string")
print(json_data)
# get R data from json formatted data
data_from_json = fromJSON(json_data)
# look the types of columns, some are different numeric != integer, factor != char
str(data_from_json)
# try to predict, this does not work, get erro : cmedv (numeric != integer)
predict(graphlearner,data_from_json)
【问题讨论】:
-
与上一个(同时)已删除问题的评论相同:使用正确的标签:“mlr3”而不是“mlr”。并且不要在这里和 Github 上交叉发布。我已经删除了后者。
-
提供reproducible example 并避免
saveRDS()来电。 -
我添加了可重现的示例。但是,我不明白为什么我应该避免使用
saveRDS()。我想将我的 graphlearner 发布为 API,我必须用这个函数保存它。你会推荐另一个好的做法吗?谢谢。 -
为什么不在预测前转换列类型?
-
对我来说,使用mlr3的好处是封装了所有的pr处理。这将帮助我们获得通用管道工服务。我们不想在管道工服务中引入预处理逻辑。我们所要做的只是加载学习器并在收到的 json 数据上调用 predict。