如何加载PMML模型?

时间:2016-06-15 14:35:39

标签: scala apache-spark apache-spark-mllib pmml

我按照PMML model export - spark.mllib的说明创建了K-means模型。

val numClusters = 10
val numIterations = 10
val clusters = KMeans.train(data, numClusters, numIterations)
// Save and load model: export to PMML
println("PMML Model:\n" + clusters.toPMML("/kmeans.xml"))

但我不知道如何在此之后加载PMML。

我正在尝试

val sameModel = KMeansModel.load(sc, "/kmeans.xml")

并出现:

org.apache.hadoop.mapred.InvalidInputException: Input path does not exist: file:/kmeans.xml/metadata

有什么想法吗?

祝你好运

3 个答案:

答案 0 :(得分:1)

我在这个spark.mllib的KMeans空间的经验有限,但这是不可能的,但你可以自己开发这个功能。

spark.mllib' KMeansModel is PMMLExportable

class KMeansModel @Since("1.1.0") (@Since("1.0.0") val clusterCenters: Array[Vector])
  extends Saveable with Serializable with PMMLExportable {

这就是为什么你可以使用toPMML将模型保存为PMML XML格式的原因。

(我再一次在Spark MLlib上获得了很少的经验)我的理解是KMeans完全是关于质心的,而当你KMeansModel.load反过来使用的是KMeansModel.SaveLoadV1_0.load {3}}读取质心并创建KMeansModel

new KMeansModel(localCentroids.sortBy(_.id).map(_.point))

对于KMeansModel.toPMML,Spark MLlib使用pmml-model' PMML(如您所见here):

new PMML("4.2", header, null)

我建议探索pmml-model' PMML如何在Spark的范围之外进行保存和加载。

旁注

为什么你甚至想在训练后使用Spark来获得模型?这确实是可能的,但是你可能会浪费你的集群资源让Spark来托管模型。

在我有限的理解中,Spark MLlib的唯一目的是使用Spark的功能(如分布和并行)来处理大型数据集以构建模型,然后在没有Spark机制的情况下使用它们。

我必须在我狭隘的观点中遗漏一些重要内容......

答案 1 :(得分:0)

正如文档中所述(对于您似乎感兴趣的版本 - 1.6.1以及最新版本 - 2.1.0),Spark仅支持导出到PMML。 load方法实际上希望检索以Spark自己的格式保存的模型,这就是为什么load方法需要某个路径以及为什么抛出异常的原因。

如果您使用Spark训练模型,您可以save以及load稍后进行。

如果您需要加载未经过Spark培训且已保存为PMML的模型,您可以使用jpmml-spark加载和评估它。

答案 2 :(得分:0)

您可以使用PMML4S-Spark加载PMML模型以在Spark中对其进行评估,例如:

import org.pmml4s.spark.ScoreModel

val model = ScoreModel.fromFile("/kmeans.xml")

model是SparkML转换器,因此您可以针对数据框进行预测:

val scoreDf = model.transform(df)