我目前正在尝试弄清楚如何加载已保存的H2O MOJO模型并在Spark DataFrame上使用它而无需使用苏打水。我尝试使用的方法是在Spark启动时加载h2o-genmodel.jar
文件,然后使用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)
model_path = rf.download_mojo(path="./mojo/", get_genmodel_jar=True)
print(model_path)
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>
。大概必须有一种方法可以从该对象实际生成值,但是我该怎么做呢?
答案 0 :(得分:1)
您可以找到返回的对象here。
classProbabilities
是Java array,并且Java数组没有toString
方法,这就是为什么您的print语句返回不易阅读的内容的原因。
访问此值的一种方法是使用py4j
例如,这应该起作用:
for i in easy_model.predictBinomial(r).classProbabilities:
... print(i)
或者您可以将其隐藏到列表中。