如何加载 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 的KMeansModel
isPMMLExportable
:
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 模型?的主要内容,如果未能解决你的问题,请参考以下文章