2017-07-26 33 views
2

我正在追趕h2o的MOJO和POJO模型格式。我能夠保存MOJO/POJO的模型與R h2o從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

的顯示如果您正在尋找進行預測在R中的H2O模式,那麼你有兩個選擇(你選擇哪一種方法取決於你的用例):

  1. 您可以使用binary model,而不是MOJO(或POJO)。對於此方法,使用h2o.saveModel()將模型導出到磁盤,然後使用h2o.loadModel()加載它並使用predict(model, test)進行預測。
  2. 如果您仍然傾向於將模型導出爲MOJO (or POJO)格式,則可以使用R中的h2o.predict_json()函數生成預測。但是,測試數據必須以JSON格式提供。有關詳細信息,請參閱此功能的文檔。
+0

你能提供一些關於每種方法的優點的更多細節嗎?我一直在使用二進制模型,保存/加載回來工作很好。但作爲我每天運行的生產線的一部分,哪種方法更好?感謝您的迴應。相當有幫助。 – horaceT

+0

如果二進制方法適合您,那麼您可以堅持使用該方法。缺點是您必須始終運行H2O簇,並且二進制模型與特定版本的H2O相關聯。 'h2o.predict_json()'方法更適合標準純Java MOJO/POJO方法的包裝。在這種情況下,您不需要運行H2O集羣,並且可以將模型編譯到更大的Java項目中。 –

+0

MOJO/POJO的速度更快,因爲在做出預測之前,您不必將測試幀(通常爲1行數據幀)轉換爲H2OFrame;你可以直接以JSON的形式傳遞這些值。除非你正在處理亞毫秒級的速度(並且加速對你來說很重要),否則如果你已經對二進制模型感到滿意,就不需要切換到MOJO/POJO。 –

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.

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創建GBM模型讓預測概率

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

所以編譯必須在java中完成,而不是在R中完成? – horaceT

+0

還有一個問題:POJO模型怎麼樣? – horaceT

+0

@horaceT是的,'download_mojo'函數保存了一個'''java'文件,它根本不依賴於'R'。要運行這個文件,編譯必須在'java'中完成。 – cd98