使用pyspark的分组数据集的PCA

时间:2018-11-08 00:33:49

标签: apache-spark pyspark apache-spark-ml apache-spark-dataset

我们的一个业务案例要求我们为较大数据集中的每个子分组(在下面的示例中为-apple,orange)数据子集运行PCA算法,即,我们要运行一个PCA对于 Type == Apple 的记录,分别使用算法;对于 Type == Orange 的记录,使用另一个PCA。

总体数据集通常包含大约5-6百万条记录,并具有100-200个特征。 类型列中的唯一值数量可能约为50K-60K。

我们想在使用python语言的spark环境中按类型值运行PCA算法。请在下面找到我可以标准化记录并运行PCA算法的python代码。但是,PCA算法是使用pyspark而不是 subgrouped 数据集运行整个数据集的。

目前,我一直坚持为分组数据集实施优化的Version PCA算法。任何帮助或指示,我们将不胜感激。

代码

df = spark.createDataFrame(
                        [("20181028","Apple",1,3,4,5),
                         ("20181029","Apple",10,2,6,7), 
                         ("20181128","Orange",12,19,7,16), 
                         ("20181129","Orange",9,7,3,5), 
                         ("20181120","Orange",6,3,4,5)],
                        ("Date", "Type","F1","F2","F3","F4")
                      )

df.show()

#Create vector
assembler = VectorAssembler(inputCols=["F1","F2","F3","F4"], outputCol="features")
VectorOutput = assembler.transform(df)

#standardize the input feature
scaler = StandardScaler(inputCol="features", outputCol="scaledFeatures",withStd=True, withMean=True)
scalerModel = scaler.fit(VectorOutput)
scaledData = scalerModel.transform(VectorOutput)

#Run PCA algo
pca = PCA(k=2, inputCol="scaledFeatures", outputCol="pcaFeatures")
model = pca.fit(scaledData)
result = model.transform(scaledData).select("Date","Type","pcaFeatures")

#Show the result
result.show(50,truncate=False)

输出

+--------+------+---+---+---+---+
|    Date|  Type| F1| F2| F3| F4|
+--------+------+---+---+---+---+
|20181028| Apple|  1|  3|  4|  5|
|20181029| Apple| 10|  2|  6|  7|
|20181128|Orange| 12| 19|  7| 16|
|20181129|Orange|  9|  7|  3|  5|
|20181120|Orange|  6|  3|  4|  5|
+--------+------+---+---+---+---+

+--------+------+-----------------------------------------+
|Date    |Type  |pcaFeatures                              |
+--------+------+-----------------------------------------+
|20181028|Apple |[1.5045340541317065,-0.9528611894036658] |
|20181029|Apple |[-0.19719398621559137,0.6812534757461064]|
|20181128|Orange|[-2.9560149391613217,-0.3754979381651896]|
|20181129|Orange|[0.6717104866798362,0.5707559972381819]  |
|20181120|Orange|[0.9769643845653697,0.07634965458456777] |
+--------+------+-----------------------------------------+

更新

我已经有一个现有案例的python实现,在这里我将遍历每个Type并建立模型。以下是我的实现方式的伪代码

foreach item in Type.Distinct()
  Filter the records corresponding to item
  Run PCA algorithm
  Append the result to output Dataset

但是,我想在Spark中实现其功能-例如,对数据进行分区,运行pca,以使pca的多个实例跨各种执行程序运行,等等。我还想知道是否有任何方法可以使用RDD对来解决其中key是类型,值是属于特定类型的所有记录。

0 个答案:

没有答案