我正在追赶h2o
的MOJO和POJO模型格式。我可以使用
h2o.download_mojo(model, path = "/media/somewhere/tmp") # ok
h2o.download_pojo(model, path = "/media/somewhere/tmp") # ok
将名称如mymodel.zip
或mymodel.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
答案 0 :(得分:8)
如果您希望在R中对H2O模型进行预测,那么您有三个选项(您选择哪种方法取决于您的用例):
h2o.saveModel()
将模型导出到磁盘,然后使用h2o.loadModel()
将其加载到H2O计算机中,并使用predict(model, test)
进行预测。此方法需要运行H2O集群。h2o.mojo_predict_df()
或h2o.mojo_predict_csv()
函数在测试集上生成预测(来自R数据)。框架或CSV文件)。 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 桥接器)。