R h2o以MOJO或POJO格式从磁盘加载已保存的模型

时间:2017-07-26 19:19:14

标签: r io h2o

我正在追赶h2o的MOJO和POJO模型格式。我可以使用

在MOJO / POJO中保存模型
h2o.download_mojo(model, path = "/media/somewhere/tmp") # ok
h2o.download_pojo(model, path = "/media/somewhere/tmp") # ok

将名称如mymodel.zipmymodel.java的对象写入目录。

然而,我不清楚如何将其读回到R中的服务器中。我试过,

saved_model2 <- h2o.loadModel("/media/somewhere/tmp/mymodel.java") # not work
saved_model3 <- h2o.loadModel("/media/somewhere/tmp/mymodel.zip") # not work

但是有这样的错误信息,

ERROR: Unexpected HTTP Status code: 400 Bad Request (url = http://localhost:54321/99/Models.bin/)

java.lang.IllegalArgumentException
 [1] "java.lang.IllegalArgumentException: Missing magic number 0x1CED at stream start"  
....
Error in .h2o.doSafeREST(h2oRestApiVersion = h2oRestApiVersion, urlSuffix = page,  : 

ERROR MESSAGE:

Missing magic number 0x1CED at stream start

3 个答案:

答案 0 :(得分:8)

如果您希望在R中对H2O模型进行预测,那么您有三个选项(您选择哪种方法取决于您的用例):

  1. 您可以使用binary model代替MOJO(或POJO)。对于此方法,您可以使用h2o.saveModel()将模型导出到磁盘,然后使用h2o.loadModel()将其加载到H2O计算机中,并使用predict(model, test)进行预测。此方法需要运行H2O集群。
  2. 如果您仍然希望将模型导出为MOJO (or POJO)格式,则可以使用R中的h2o.mojo_predict_df()h2o.mojo_predict_csv()函数在测试集上生成预测(来自R数据)。框架或CSV文件)。
  3. 作为#2的替代方案,如果您的数据采用JSON格式,则可以使用h2o.predict_json(),但一次只能获得一行。

答案 1 :(得分:3)

h2o.loadModel旨在与h2o.saveModel一起使用。如果要编译并运行MOJO,则需要执行以下操作:

首先让我们说你从GBM创建了一个MOJO:

library(h2o)
h2o.init(nthreads=-1)
path = "http://h2o-public-test-data.s3.amazonaws.com/smalldata/prostate/prostate.csv"
h2o_df = h2o.importFile(path)
h2o_df$RACE = as.factor(h2o_df$RACE)
model = h2o.gbm(y="CAPSULE",
        x=c("AGE", "RACE", "PSA", "GLEASON"),
        training_frame=h2o_df,
        distribution="bernoulli",
        ntrees=100,
        max_depth=4,
        learn_rate=0.1)

然后将MOJO和生成的h2o-genmodel.jar文件下载到新的实验文件夹中。请注意,h2o-genmodel.jar文件是一个支持评分的库,包含所需的读者和解释器。将MOJO模型部署到生产环境时,此文件是必需的。

modelfile = model.download_mojo(path="~/experiment/", get_genmodel_jar=True)
print("Model saved to " + modelfile)
Model saved to /Users/user/GBM_model_R_1475248925871_74.zip"

然后你会打开一个新的终端窗口并切换到你有MOJO文件.zip和.jar的实验目录。

$ cd experiment

然后,您将通过创建名为main.java的新文件(例如,使用“vim main.java”)在实验文件夹中创建主程序。包括以下内容。请注意,此文件引用上面使用R。

创建的GBM模型
import java.io.*;
import hex.genmodel.easy.RowData;
import hex.genmodel.easy.EasyPredictModelWrapper;
import hex.genmodel.easy.prediction.*;
import hex.genmodel.MojoModel;

public class main {
  public static void main(String[] args) throws Exception {
    EasyPredictModelWrapper model = new EasyPredictModelWrapper(MojoModel.load("GBM_model_R_1475248925871_74.zip"));

    RowData row = new RowData();
    row.put("AGE", "68");
    row.put("RACE", "2");
    row.put("DCAPS", "2");
    row.put("VOL", "0");
    row.put("GLEASON", "6");

    BinomialModelPrediction p = model.predictBinomial(row);
    System.out.println("Has penetrated the prostatic capsule (1=yes; 0=no): " + p.label);
    System.out.print("Class probabilities: ");
    for (int i = 0; i < p.classProbabilities.length; i++) {
      if (i > 0) {
    System.out.print(",");
      }
      System.out.print(p.classProbabilities[i]);
    }
    System.out.println("");
  }
}

然后在终端窗口2中编译并运行以显示预测概率

$ javac -cp h2o-genmodel.jar -J-Xms2g -J-XX:MaxPermSize=128m main.java
$ java -cp .:h2o-genmodel.jar main  

答案 2 :(得分:0)

较新版本的 H2O 能够通过 python API 导入 MOJO:

# re-import saved MOJO
imported_model = h2o.import_mojo(path)

new_observations = h2o.import_file(path='new_observations.csv')
predictions = imported_model.predict(new_observations)

注意:MOJO 不能重新导入到缺少 h2o.import_mojo() 函数的旧版 H2O 中的 python。

所以 h2o.save_model() 似乎失去了它的作用——我们可以只使用 my_model.save_mojo()(注意它不是一个 h2o 方法,而是模型对象的一个​​属性),因为这些文件可以不仅可以用于 Java 应用程序的部署,还可以用于 Python(实际上他们内部仍然使用 Python-Java 桥接器)。