问题描述
我正在对我的数据进行 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
中的 PCAModel
和 org.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)