如何在预测阶段使用mlr3包解码JSON数据?

问题描述 投票:0回答:1

我用graphlearner包开发了一个mlr3,我想将其发布在Rplumber服务中。但是,当我收到用于预测的数据(JSON格式的数据)时,graphlearner难以识别数据,因为fromJSONjsonlite函数无法推断正确的类型(已从中学习图形) 。您对此有解决方案吗?在预测阶段是否有一种机制可以管理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')

预测步骤:有效(模拟数据进行预测,删除目标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)

和错误:

Erreur:无法rbind任务:类型与列不匹配:cmedv(数字!=整数)

UPDATE可复制的示例

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)

r jsonlite mlr3
1个回答
4
投票

我想我们可能会在某个时候解决此问题,但是在有可用的修复程序之前,我建议您通过保存task$feature_types的模式来修复此问题,以解决此问题。

library(mlr3misc)
repair_schema = function(data, feature_types) {
   imap_dtc(data, function(v, k) {
    ft_type = feature_types[id == k,][["type"]]
    if (typeof(v) != ft_type) {
      fn = switch(ft_type,
        "character" = as.character,
        "factor" = as.factor,
        "numeric" = as.numeric,
        "integer" = as.integer
      )
      v = fn(v)
    }
    return(v)
  })
}
data_from_json2 = repair_schema(data_from_json, task$feature_types)
predict(graphlearner,data_from_json2)

此方法还可以为您提供更大的灵活性,因为您可能会遇到各种编码问题,这些问题并非总是可以预期的。

© www.soinside.com 2019 - 2024. All rights reserved.