如何加载 PMML 模型?

Posted

技术标签:

【中文标题】如何加载 PMML 模型?【英文标题】:How to load a PMML model? 【发布时间】:2016-10-16 17:57:36 【问题描述】:

我正在按照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

有什么想法吗?

最好的问候

【问题讨论】:

似乎没有任何方法可以导入 PMML 模型。所以,我改变了创建模型的方式,用KMeansModel.save 仅以 PMML 格式存储模型重要吗?因为您可以只保存模型然后重新加载它。 我建议你看看这个项目,它为 Spark 添加了更多功能齐全的 PMML 功能:github.com/jpmml/jpmml-spark。 【参考方案1】:

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

如果您使用 Spark 训练了模型,您可以在稍后save 它和load 它。

如果您需要加载未在 Spark 中训练并保存为 PMML 的模型,您可以使用 jpmml-spark 来加载和评估它。

【讨论】:

【参考方案2】:

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

spark.mllib 的KMeansModelisPMMLExportable:

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.load 又使用读取质心并创建的KMeansModel.SaveLoadV1_0.load一个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 机器的情况下使用它们。

在我狭隘的观点中,我一定遗漏了一些重要的东西......

【讨论】:

嗨 Jacek,我正在使用它进行近实时分析。所以我使用了 Lambda 架构:我制作了一个批处理模型(这需要很多时间),我需要分析我想要加载该模型的数据。【参考方案3】:

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

import org.pmml4s.spark.ScoreModel

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

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

val scoreDf = model.transform(df)

【讨论】:

【参考方案4】:

PMML 文件实际上是具有数据挖掘联盟定义的模式的 xml 文件。因此,您可以根据此处 DMC 和 PMML 网页上给出的合同定义反序列化器,也可以使用 3rd 方库。

我正在研究 jpmml 库,用于在 Spring 应用程序中合并 python 准备好的模型。

这里的信息: https://github.com/jpmml http://dmg.org/pmml/v4-1/GeneralStructure.html

【讨论】:

以上是关于如何加载 PMML 模型?的主要内容,如果未能解决你的问题,请参考以下文章

如何将逻辑回归和kmeans pmml文件导入r

pmml(模型标准化)

将 python scikit 学习模型导出到 pmml

机器学习PMML简述

将 PMML 模型导入 Python (Scikit-learn)

如何在 R 中导出时间序列模型?