r - 如何将 R 模型转换为原始二进制或字符串缓冲区?
问题描述
我在第三方环境(IBM Watson Studio)中使用 R 3.6 工作,需要能够将模型对象转换为原始二进制文件或字符串缓冲区,以便按照此处所示保存模型。简而言之,我必须使用一个函数来发出 API 请求,该请求通过原始二进制/字符串缓冲区数据发送以保存文件。与此问题类似,我选择使用jsonlite::serializeJSON()
(然后转换为原始)将模型转换为 JSON。它似乎有效,但与那个帖子中的人相似,我遇到了问题serializeJSON()
无法正确转换模型对象中的复杂列表。当我尝试预测时,它会遇到“找不到函数“列表””错误。由于我有 GLM,即使在实施建议的修复后,我现在也会遇到错误“找不到对象'C_logit_linkinv'”。显然,这种方法对于不同的模型不会很普遍。
我作为一个新问题发布,因为在我的情况下没有任何解决方案有效,并且因为我想看看是否有一种更强大的方法可以将模型对象转换为原始字节或字符串缓冲区。我没有在 IBM 板上发帖,因为我觉得这是关于模型对象和转换的更普遍的问题,但如果社区认为这更合适,我会这样做。这是一个可重现的示例:
require(jsonlite)
# Generate some data
data <- data.frame(x1=rnorm(100),
y=rbinom(100,1,.6))
# Fit and convert model->JSON->Raw
fitted_model <- glm(y ~ 0 + .,
data = data,
family = binomial)
model_as_json <- jsonlite::serializeJSON(fitted_model)
model_as_raw <- charToRaw(model_as_json)
# Convert back to model
back_to_json <- rawToChar(model_as_raw)
back_to_model <- jsonlite::unserializeJSON(back_to_json)
# Score
scoring_data <- data.frame(x1=rnorm(5))
predict(object=back_to_model,
newdata = scoring_data,
type='response')
眼镜:
- R 版本 3.6.1 (2019-07-05)
- 平台:x86_64-conda_cos6-linux-gnu(64位)
- 运行于:Red Hat Enterprise Linux 8.2 (Ootpa)
- jsonlite_1.7.1
解决方案
您可以使用返回原始向量serialize()
的connection
参数集并进行恢复。NULL
unserialize()
重要的是,根据文档:
参考对象的共享保留在对象内
set.seed(9)
data <- data.frame(x1=rnorm(100),
y=rbinom(100,1,.6))
# Fit and convert model -> Raw
fitted_model <- glm(y ~ 0 + .,
data = data,
family = binomial)
model_as_raw <- serialize(fitted_model, connection = NULL)
# Convert back to model
back_to_model <- unserialize(model_as_raw)
# Check that predict works
scoring_data <- data.frame(x1=rnorm(5))
predict(object=back_to_model,
newdata = scoring_data,
type='response')
1 2 3 4 5
0.4908404 0.4871576 0.4955416 0.4978725 0.5065067
推荐阅读
- python - 如何在函数外部访问此变量?
- python - 如何传递错误 IndexError: single positional indexer is out-of-bounds in python
- sql-server - CASE WHEN 语句产生重复项?
- kubernetes - 如何解决获取服务“default/frontend-svc”的端点时出错:本地存储中没有对象匹配键“default/frontend-svc”
- php - 调用未定义的方法 Laravel\Socialite\Facades\Socialite::isDeferred()
- sockets - Nginx ingress:上游连接超时(操作超时)
- python - numpy 连接错误“只有整数标量数组可以转换为标量索引”
- python - 如何正确地将python命令行参数提取到字符串中
- wordpress - 将元素或组控件添加到主元素或类或主渲染函数之外的类
- python - 如何按月计算值的数量,然后在折线图中绘制图表?