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

p3rjfoxz  于 2021-07-12  发布在  Spark
关注(0)|答案(2)|浏览(310)

我正在对我的数据进行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, 0, 0, 0, 1)),
  new LabeledPoint(1, Vectors.dense(1, 1, 0, 1, 0)),
  new LabeledPoint(1, Vectors.dense(1, 1, 0, 0, 0)),
  new LabeledPoint(0, Vectors.dense(1, 0, 0, 0, 0)),
  new LabeledPoint(1, Vectors.dense(1, 1, 0, 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对象以供将来使用。有人能给我一个基于上述代码的例子吗?

w8ntj3qf

w8ntj3qf1#

pca mlib版本似乎不支持将模型保存到磁盘。您可以保存生成的pcamodel的pc矩阵。但是,请使用spar ml版本。它返回可以序列化并包含在sparkml管道中的spark估计器。

ao218c7q

ao218c7q2#

示例代码基于@emicareofcell44 answer,使用 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, 0.0, 0.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)

相关问题