如何在spark scala中保存PCA对象?

问题描述

我正在对我的数据进行 PCA 并阅读以下指南:https://spark.apache.org/docs/latest/mllib-dimensionality-reduction

相关代码如下:

import org.apache.spark.mllib.feature.PCA
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.rdd.RDD

val data: RDD[LabeledPoint] = sc.parallelize(Seq(
  new LabeledPoint(0,Vectors.dense(1,1)),new LabeledPoint(1,1,0)),new LabeledPoint(0,0))))

// Compute the top 5 principal components.
val pca = new PCA(5).fit(data.map(_.features))

// Project vectors to the linear space spanned by the top 5 principal
// components,keeping the label
val projected = data.map(p => p.copy(features = pca.transform(p.features)))

代码对数据执行 PCA。但是,我找不到解释如何保存和加载适合的 PCA 对象以备将来使用的示例代码或文档。有人可以根据上面的代码给我一个例子吗?

解决方法

PCA mlib 版本似乎不支持将模型保存到磁盘。您可以改为保存生成的 PCAModel 的 pc 矩阵。但是,请使用 spar ML version。它返回一个可以序列化并包含在 Spark ML 管道中的 Spark Estimator。

,

基于@EmiCareOfCell44 答案的示例代码,使用 PCA 中的 PCAModelorg.apache.spark.ml.feature

import org.apache.spark.ml.feature.{PCA,PCAModel}
import org.apache.spark.ml.linalg.Vectors

val data = Array(
  Vectors.sparse(5,Seq((1,1.0),(3,7.0))),Vectors.dense(2.0,0.0,3.0,4.0,5.0),Vectors.dense(4.0,6.0,7.0)
)
val df = spark.createDataFrame(data.map(Tuple1.apply)).toDF("features")

val pca = new PCA()
  .setInputCol("features")
  .setOutputCol("pcaFeatures")
  .setK(3)
  .fit(df)

val result = pca.transform(df).select("pcaFeatures")
result.show(false)

// save the model
val savePath = "xxxx"
pca.save(savePath)

// load the save model
val pca_loaded = PCAModel.load(savePath)