2

我有一个以 mojo 格式保存的 h2o 模型,现在我正在尝试加载它并使用它来对新数据集 ( df) 进行预测,作为用 scala 编写的 spark 应用程序的一部分。理想情况下,我希望在现有 DataFrame 中添加一个新行,其中包含基于此模型的类概率。

我可以看到如何将 mojo 应用于已经以 RowData 格式的单个行(根据此处的答案),但我不确定如何映射现有的 DataFrame 以便它以正确的格式使用 mojo 进行预测模型。我曾经使用过 DataFrames,但从来没有使用过底层的 RDD。

此外,这个模型是否应该被序列化/广播,以便预测可以在集群上并行完成,还是作为地图的一部分可供所有执行者使用?

我已经做到了这一点:

# load mojo model and create easy predict model wrapper
val mojo = MojoModel.load("loca/path/to/mojo/mojo.zip")
val easyModel = new EasyPredictModelWrapper(mojo)

# map over spark DataFrame, converty to rdd, and make predictions on each row:
df.rdd.map { row =>
   val prediction = easyModel.predictBinomial(row).classProbabilities
   println(prediction)
   }

但是我的row变量的格式不正确,无法正常工作。关于下一步尝试什么的任何建议?

编辑:我的 DataFrame 由 70 个预测特征列组成,它们是整数和类别/因子列的混合。一个非常简单的示例 DataFrame:

val df = Seq(
  (0, 3, "cat1"),
  (1, 2, "cat2"),
  (2, 6, "cat1")
).toDF("id", "age", "category")
4

2 回答 2

1

使用此函数准备 H2O 所需的 RowData 对象:

def rowToRowData(df: DataFrame, row: Row): RowData = {
  val rowAsMap = row.getValuesMap[Any](df.schema.fieldNames)
  val rowData = rowAsMap.foldLeft(new RowData()) { case (rd, (k,v)) => 
    if (v != null) { rd.put(k, v.toString) }
    rd
  }
  rowData
}
于 2017-12-17T14:27:47.170 回答
0

我在这里有一个完整的答案:https ://stackoverflow.com/a/47898040/9120484 您可以直接在 df 上调用 map 而不是在 rdd 上调用。

于 2018-01-26T15:32:03.037 回答