【问题标题】:How to load a PMML model?如何加载 PMML 模型?
【发布时间】: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

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


【解决方案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

      【讨论】:

        猜你喜欢
        • 2020-11-03
        • 1970-01-01
        • 2019-06-23
        • 2017-06-14
        • 2019-06-05
        • 2017-07-18
        • 2017-10-14
        • 2017-11-25
        • 2019-03-27
        相关资源
        最近更新 更多