我已经使用VectorAssembler
多次,效果很好。但是今天,我将不需要的数据添加到功能中,如下图所示。
输入是来自pySpark数据帧的4个没有NaN的特征。
assembler = VectorAssembler(inputCols = descritif.columns, outputCol = 'features')
pcaFeatures = assembler.transform(descritif).select('features')
pcaFeatures.show(truncate=False)
为了解决我的问题,两天后我找到了解决方案。堆栈中有两个帖子,未提供有效的解决方案。
1-首先使用此udf函数转换数据。
from pyspark.sql import functions as F
from pyspark.sql import types as T
from pyspark.ml.linalg import SparseVector, DenseVector
def sparse_to_array(v):
v = DenseVector(v)
new_array = list([float(x) for x in v])
return new_array
sparse_to_array_udf = F.udf(sparse_to_array, T.ArrayType(T.FloatType()))
2-然后将其应用于数据。#转换
df = pcaFeatures.withColumn('features_array', sparse_to_array_udf('features'))
然后,如果您想将此矩阵转换为Vector pleas,请访问此网站。Convert in Vector,因为在此步骤之后,您可能最终得到的是稀疏矩阵而不是向量,那么在拟合/转换数据时,您会在PCA或其他设备上收到此错误(如下)。
IllegalArgumentException:'要求失败:列pcaFeatures_Norm必须是类型struct,values:array>但实际上是数组。'