与sk_learn相比,spark mllib的PCA降维方法,只能设置最终降维的维数。
image.png
实例demo:
val spark = SparkSession.builder()
.master("local[2]")
.appName("Spark Mllib")
.getOrCreate()
val df = spark.createDataFrame(Seq(
(0, 1.2), (1, 2.3), (2, 4.4), (3, 5.4), (4, 3.7), (5, 99.5)
)).toDF("id", "category")
// //多列合并成1列
// import spark.implicits._
// val df_pca=df.map(_.toSeq.foldLeft("")(_+","+_).substring(1)).toDF("features")
//
// df_pca.show()
//将多列合并成1列Vector
//VectorAssembler不支持合并String类型
val assembler1 = new VectorAssembler().
setInputCols(df.columns).
setOutputCol("features")
val df_pca = assembler1.transform(df)
val pca = new PCA()
.setInputCol("features")
.setOutputCol("pcaFeatures")
.setK(1)
.fit(df_pca)
val rs = pca.transform(df_pca)
rs.show()
踩坑:
1.Spark MLlib提供的PCA变换方法最多只能处理65535维的数据
2.在做PCA降维之前,我们需要将数据集的特征合并为1列,
一开始在实际中,合并为一列的方法就是以字符串相隔,将多个列拼接起来,是String类型;
但是PCA所接受的参数类型只能是Vector,所以这里合并为1列的方法,最好还是使用VectorAssembler()方法。
3.还需要注意的是VectorAssembler进行列合并时,不能有类型为String的特征列。
网友评论