Я разработал graphlearner
с пакетом mlr3
, и я хотел бы опубликовать sh в сервисе Rplumber
. Однако когда я получаю данные для прогнозирования (данные в формате JSON), graphlearner
не может распознать данные, потому что функция fromJSON
для jsonlite
не выводит правильные типы (для которых был построен график). научился). У вас есть решение для этого? Существует ли механизм управления JSON данными в млр3 на этапе прогнозирования?
Шаг обучения
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')
Шаг прогнозирования: работает (смоделировать данные для прогнозирования, удалить целевое число)
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 (цифра c! = целое число)
ОБНОВЛЕНИЕ Воспроизводимый пример
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)