如何在SAP HANA Studio中保存R randomForest对象?

3pmvbmvn  于 2023-06-19  发布在  其他
关注(0)|答案(1)|浏览(115)

我是SAP World的新手,我正在尝试使用SAP HANA Studio中安装的R Server(HANA Studio版本:2.3.8和R Server 3.4.0版本)
我的任务是:

  • 在HANA Studio中的R Server上训练randomForest模型(借助HANA上的RLANG过程)
  • 将randomForest模型保存为HANA中的PAL模型对象
  • 使用该模型对HANA中的新数据进行预测

下面是一个RLANG过程的小例子,用于在HANA上训练和保存模型:

PROCEDURE "PA"."RF_TRAIN" ( 
    IN data "PA"."IRIS", 
    OUT modelOut "PA"."TRAIN_MODEL"
 ) 
    LANGUAGE RLANG 
SQL SECURITY INVOKER 
DEFAULT SCHEMA "PA"
AS
BEGIN

require(randomForest)
require(dplyr)
require(pmml)
# iris <- as.data.frame(data)
data(iris)
iris <- iris %>% mutate(y = factor(ifelse(Species == "setosa", 1, 0)))
model <- randomForest(y~Sepal.Length + Sepal.Width + Petal.Length + Petal.Width, iris,
         importance = TRUE,
         ntree = 500)
modelOut <- as.data.frame(pmml(model))

END;

(请不要混淆,我没有使用我的输入数据进行模型训练,这不是一真实的例子)
下面是SAP HANA上模型的表的外观:

在这个例子中,训练是有效的,但我不知道如何将随机森林对象保存在SAP HANA数据库中,或者如何将随机森林对象转换为图片中的类似对象。
会很感激任何帮助:)

qni6mghb

qni6mghb1#

如果您计划使用R服务器进行预测,则可以将随机Forest模型存储为SAP HANA中的BLOB对象。
SAP HANA R Integration Guide之后,您需要。
1.在表"PA"."TRAIN_MODEL中包含BLOB属性。
1.在将模型写入表之前,使用函数serialize将其存储为二进制。
1.调用predict过程时加载并Unserialize模型。
在你的R脚本中。

require(randomForest)
require(dplyr)
require(pmml)
generateRobjColumn <- function(...){
        result <- as.data.frame(cbind(
            lapply(
                list(...),
                function(x) if (is.null(x)) NULL else serialize(x, NULL)
            )
        ))
        names(result) <- NULL
        names(result[[1]]) <- NULL
        result
    }
# iris <- as.data.frame(data)
data(iris)
iris <- iris %>% mutate(y = factor(ifelse(Species == "setosa", 1, 0)))
model <- randomForest(y~Sepal.Length + Sepal.Width + Petal.Length + Petal.Width, iris,
         importance = TRUE,
         ntree = 500)
modelOut <- data.frame(ID = 1, MODEL = generateRobjColumn(pmml(model)))

请注意,如果您计划按原样重用模型,那么实际上并不需要使用pmml
在另一个过程中,您将需要调用此表并取消序列化模型以进行预测。

CREATE PROCEDURE "PA"."RF_PREDICT" (IN data "PA"."IRIS", IN modelOut "PA"."TRAIN_MODEL", OUT result "PA"."PRED")
LANGUAGE RLANG AS
BEGIN
  rfModel <- unserialize(modelOut$MODEL[[1]])
  result <- predict(rfModel, newdata = data) # or whatever steps you need for prediction
END;

相关问题