7

我正在按照PMML 模型导出 - 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

任何想法?

此致

4

4 回答 4

1

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

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

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

于 2017-05-30T13:13:43.550 回答
1

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

spark.mllibKMeansModel 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读取质心并创建一个KMeansModel

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

对于KMeansModel.toPMML,Spark MLlib 使用 pmml-model PMML(如您在此处看到的):

new PMML("4.2", header, null)

我建议探索 pmml-model 的PMML如何保存和加载,因为这超出了 Spark 的范围。


旁注

为什么在训练模型之后还要使用 Spark 来构建模型?这确实是可能的,但您可能会浪费集群资源让 Spark 来托管模型。

在我有限的理解中,Spark MLlib 的唯一目的是利用 Spark 的分布和并行性等特性来处理大型数据集来构建模型,然后在没有 Spark 机器的情况下使用它们。

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

于 2017-05-31T07:08:55.330 回答
0

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

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

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

于 2021-12-09T11:11:05.753 回答
0

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

import org.pmml4s.spark.ScoreModel

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

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

val scoreDf = model.transform(df)
于 2019-08-22T01:29:25.410 回答