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
你能提供一些關於每種方法的優點的更多細節嗎?我一直在使用二進制模型,保存/加載回來工作很好。但作爲我每天運行的生產線的一部分,哪種方法更好?感謝您的迴應。相當有幫助。 – horaceT
如果二進制方法適合您,那麼您可以堅持使用該方法。缺點是您必須始終運行H2O簇,並且二進制模型與特定版本的H2O相關聯。 'h2o.predict_json()'方法更適合標準純Java MOJO/POJO方法的包裝。在這種情況下,您不需要運行H2O集羣,並且可以將模型編譯到更大的Java項目中。 –
MOJO/POJO的速度更快,因爲在做出預測之前,您不必將測試幀(通常爲1行數據幀)轉換爲H2OFrame;你可以直接以JSON的形式傳遞這些值。除非你正在處理亞毫秒級的速度(並且加速對你來說很重要),否則如果你已經對二進制模型感到滿意,就不需要切換到MOJO/POJO。 –