我按照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
有什么想法吗?
祝你好运
答案 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)