直接从Java保存H2O模型

直接从Java保存H2O模型,java,maven,h2o,Java,Maven,H2o,我试图直接从Java创建并保存生成的模型。指定了如何在R和Python中执行此操作,而不是在Java中。以前也问过类似的问题,但没有给出真正的答案(除了链接到H2O文档之外,它不包含代码示例) 就我目前的目的而言,获取一些指针,以便能够将以下参考代码翻译成Java就足够了。我主要是在寻找从导入的相关JAR的指导 我想我已经找到了我问题的答案。下面是一个自包含的示例代码。然而,我仍然很感激社区的回答,因为我不知道这是否是最好的/惯用的方法 package org.name.company; im

我试图直接从Java创建并保存生成的模型。指定了如何在R和Python中执行此操作,而不是在Java中。以前也问过类似的问题,但没有给出真正的答案(除了链接到H2O文档之外,它不包含代码示例)

就我目前的目的而言,获取一些指针,以便能够将以下参考代码翻译成Java就足够了。我主要是在寻找从导入的相关JAR的指导

我想我已经找到了我问题的答案。下面是一个自包含的示例代码。然而,我仍然很感激社区的回答,因为我不知道这是否是最好的/惯用的方法

package org.name.company;

import hex.glm.GLMModel;
import water.H2O;
import water.Key;
import water.api.StreamWriter;
import water.api.StreamingSchema;
import water.fvec.Frame;
import water.fvec.NFSFileVec;
import hex.glm.GLMModel.GLMParameters.Family;
import hex.glm.GLMModel.GLMParameters;
import hex.glm.GLM;
import water.util.JCodeGen;

import java.io.*;
import java.util.Map;

public class Launcher
{
    public static void initCloud(){
        String[] args = new String [] {"-name", "h2o_test_cloud"};
        H2O.main(args);
        H2O.waitForCloudSize(1, 10 * 1000);
    }

    public static void main( String[] args ) throws Exception {
        // Initialize the cloud
        initCloud();

        // Create a Frame object from CSV
        File f = new File("/path/to/data.csv");
        NFSFileVec nfs = NFSFileVec.make(f);
        Key frameKey = Key.make("frameKey");
        Frame fr = water.parser.ParseDataset.parse(frameKey, nfs._key);

        // Create a GLM and output coefficients
        Key modelKey = Key.make("modelKey");
        try {
            GLMParameters params = new GLMParameters();
            params._train = frameKey;
            params._response_column = fr.names()[1];
            params._intercept = true;
            params._lambda = new double[]{0};
            params._family = Family.gaussian;

            GLMModel model = new GLM(params).trainModel().get();
            Map<String, Double> coefs = model.coefficients();
            for(Map.Entry<String, Double> entry : coefs.entrySet()) {
                System.out.format("%s: %f\n", entry.getKey(), entry.getValue());
            }

            String filename = JCodeGen.toJavaId(model._key.toString()) + ".java";
            StreamingSchema ss = new StreamingSchema(model.new JavaModelStreamWriter(false), filename);
            StreamWriter sw = ss.getStreamWriter();
            OutputStream os = new FileOutputStream("/base/path/" + filename);
            sw.writeTo(os);

        } finally {
            if (fr != null) {
                fr.remove();
            }
        }
    }
}
package org.name.company;
导入hex.glm.GLMModel;
进口水.H2O;
进口水;
导入water.api.StreamWriter;
进口水、api、StreamingSchema;
导入water.fvec.Frame;
导入water.fvec.NFSFileVec;
导入hex.glm.GLMModel.glmpareters.Family;
导入hex.glm.GLMModel.glm参数;
导入hex.glm.glm;
导入water.util.JCodeGen;
导入java.io.*;
导入java.util.Map;
公共类启动器
{
公共静态void initCloud(){
字符串[]args=新字符串[]{“-name”,“h2o_测试_cloud”};
H2O.干管(args);
H2O.云量(1,10*1000);
}
公共静态void main(字符串[]args)引发异常{
//初始化云
initCloud();
//从CSV创建帧对象
文件f=新文件(“/path/to/data.csv”);
NFSFileVec nfs=NFSFileVec.make(f);
Key frameKey=Key.make(“frameKey”);
Frame fr=water.parser.ParseDataset.parse(frameKey,nfs.\u key);
//创建GLM并输出系数
Key modelKey=Key.make(“modelKey”);
试一试{
GLMParameters params=新的GLMParameters();
参数_train=frameKey;
参数响应列=fr.names()[1];
参数_intercept=true;
params._lambda=新的双精度[]{0};
参数。\u family=family.gaussian;
GLMModel model=新GLM(参数).trainModel().get();
Map coefs=模型系数();
for(Map.Entry:coefs.entrySet()){
System.out.format(“%s:%f\n”、entry.getKey()、entry.getValue());
}
字符串文件名=JCodeGen.toJavaId(model._key.toString())+“.java”;
StreamingSchema ss=新StreamingSchema(model.new JavaModelStreamWriter(false),文件名);
StreamWriter sw=ss.getStreamWriter();
OutputStream os=新文件OutputStream(“/base/path/”+文件名);
软件写入(os);
}最后{
如果(fr!=null){
fr.删除();
}
}
}
}

像这样的东西能奏效吗

public void saveModel(URI uri, Keyed<Frame> model)
{
    Persist p = H2O.getPM().getPersistForURI(uri);
    OutputStream os = p.create(uri.toString(), true);
    model.writeAll(new AutoBuffer(os, true)).close();
}
公共void保存模型(URI,键控模型)
{
Persist p=H2O.getPM().getPersistForURI(uri);
OutputStream os=p.create(uri.toString(),true);
model.writeAll(新的自动缓冲(os,true)).close();
}
确保URI具有正确的形式,否则npe上的H2O将破裂。至于Maven,你应该能够避开h2o核心

    <dependency>
        <groupId>ai.h2o</groupId>
        <artifactId>h2o-core</artifactId>
        <version>3.14.0.2</version>
    </dependency>

ai.h2o
水核
3.14.0.2

我还没有答案,但我创建了一个JIRA票证,将其添加到H2O用户指南中:谢谢@ErinLeDell。为pojos和mojos评分所需的jar文件是H2O genmodel(这是maven工件)。@TomKraljevic感谢您的回复。一旦您从一个经过训练的模型中获得了POJO,那么您就需要
h2o genmodel.jar
将其嵌入Java应用程序中。然而,我的问题是关于从Java创建POJO本身。它列出了完整的工件集。
    <dependency>
        <groupId>ai.h2o</groupId>
        <artifactId>h2o-core</artifactId>
        <version>3.14.0.2</version>
    </dependency>