Прогнозирование с помощью модели H2O MOJO с использованием hex.genmodel API - PullRequest
0 голосов
/ 06 декабря 2018

В настоящее время я пытаюсь выяснить, как можно загрузить сохраненную модель H2O MOJO и использовать ее в кадре данных Spark без использования газированной воды.Подход, который я пытаюсь использовать, - это загрузить файл h2o-genmodel.jar при запуске Spark, а затем использовать, а затем использовать интерфейс PySpark Py4J для доступа к нему.Мой конкретный вопрос будет о том, как получить доступ к значениям, сгенерированным объектами py4j.java_gateway.

Ниже приведен минимальный пример:

Модель поезда

import h2o
from h2o.estimators.random_forest import H2ORandomForestEstimator
import pandas as pd
import numpy as np

h2o.init()

features = pd.DataFrame(np.random.randn(6,3),columns=list('ABC'))
target = pd.DataFrame(pd.Series(["cat","dog","cat","dog","cat","dog"]), columns=["target"])
df = pd.concat([features, target], axis=1)
df_h2o = h2o.H2OFrame(df)

rf = H2ORandomForestEstimator()
rf.train(["A","B","C"],"target",training_frame=df_h2o, validation_frame=df_h2o)

Сохранить MOJO

model_path = rf.download_mojo(path="./mojo/", get_genmodel_jar=True)
print(model_path)

Загрузка MOJO

from pyspark.sql import SparkSession

spark = SparkSession.builder.config("spark.jars", "/home/ec2-user/Notebooks/mojo/h2o-genmodel.jar").getOrCreate()

MojoModel = spark._jvm.hex.genmodel.MojoModel
EasyPredictModelWrapper = spark._jvm.hex.genmodel.easy.EasyPredictModelWrapper
RowData = spark._jvm.hex.genmodel.easy.RowData

mojo = MojoModel.load(model_path)
easy_model = EasyPredictModelWrapper(mojo)

Прогнозирование на одном ряду данных

r = RowData()
r.put("A", -0.631123)
r.put("B", 0.711463)
r.put("C", -1.332257)

score = easy_model.predictBinomial(r).classProbabilities

Итак, до сих пор я смог добраться.Проблема в том, что мне трудно понять, что score возвращает мне.print(score) дает следующее: <py4j.java_gateway.JavaMember at 0x7fb2e09b4e80>.Предположительно, должен быть путь к фактическим сгенерированным значениям из этого объекта, но как мне это сделать?

1 Ответ

0 голосов
/ 06 декабря 2018

Вы можете найти возвращенный объект здесь .classProbabilities - это массив Java , а в массивах Java нет метода toString, поэтому ваш оператор print возвращает что-то нечитаемое человеком.

Один из способов доступаэто значение будет использовать py4j

, например, это должно работать:

for i in easy_model.predictBinomial(r).classProbabilities:
...     print(i)

или вы можете преобразовать его в список.

...