首页 文章

使用PySpark的Spark 2.3.0示例中的PCA

提问于
浏览
0

我有一个Spark数据帧,我想用它来运行一个简单的PCA示例 . 我看了this example并注意到这是有效的,因为它们将功能转换为向量:

from pyspark.ml.linalg import Vectors
>>> data = [(Vectors.sparse(5, [(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]),)]
>>> df = spark.createDataFrame(data,["features"])
>>> pca = PCA(k=2, inputCol="features", outputCol="pca_features")

我试图通过使用我自己创建的Spark Dataframe重现相同类型的简单PCA . 如何将我的Spark DataFrame转换为类似于上面的形式,以便我可以使用一个输入列和一个输出列来运行它?

我查看了使用RowMatrix as shown here,但我不明白这是否可行(参见下面的错误) .

>>>from pyspark.mllib.linalg import Vectors
>>>from pyspark.mllib.linalg.distributed import RowMatrix
>>>from pyspark.ml.feature import PCA
>>>master = pd.read_parquet('master.parquet',engine='fastparquet')
>>>A = sc.parallelize(master)
>>>mat = RowMatrix(A)
>>>pc = mat.computePrincipalComponents(4)

Py4JJavaError:调用o382.computePrincipalComponents时发生错误 . :org.apache.spark.SparkException:作业因阶段失败而中止:阶段1.0中的任务0失败1次,最近失败:阶段1.0中丢失的任务0.0(TID 1,localhost, Actuator 驱动程序):org.apache.spark .api.python.PythonException:Traceback(最近一次调用最后一次)

1 回答

  • 1

    在Pyspark for mllib库中,您需要将所有功能转换为单个特征向量 . 您可以使用Vector Assembler执行相同的操作:https://spark.apache.org/docs/latest/ml-features.html#vectorindexer

    from pyspark.ml.feature import VectorAssembler
    assembler = VectorAssembler(inputCols=inputColumnsList,outputCol='features')
    assembler.transform(df)
    

    其中inputColsList包含您要使用的所有功能的列表

相关问题