我有一个使用Spark的VectorAssembler打包成矢量向量的特征列,如下所示。 data是输入数据帧(类型spark.sql.DataFrame)。将特征的Spark向量转换为数组
val featureCols = Array("feature_1","feature_2","feature_3")
val featureAssembler = new VectorAssembler().setInputCols(featureCols).setOutputCol("features")
val dataWithFeatures = featureAssembler.transform(data)
我开发使用Classifier和ClassificationModel开发API的自定义分类。 ClassificationModel需要开发一个predictRaw()函数,该函数从模型输出预测标签的向量。
def predictRaw(features: FeaturesType) : Vector
这个功能是通过该API集和需要一个参数,的FeaturesType特征,并输出向量(这在我的情况下,我要带去是火花DenseVector作为DenseVector延伸Vector性状)。
由于VectorAssembler的包装,features列的类型为Vector,每个元素本身就是一个向量,它是每个训练样本的原始特征的向量。例如:
设有柱 - 型的矢量
[1.0,2.0,3.0] - 元素1,本身的矢量
[3.5,4.5,5.5] - element2的,本身的载体
我需要将这些功能提取到Array[Double]以实现我的predictRaw()逻辑。理想情况下,我想下面的结果,以保持基数:
`val result: Array[Double] = Array(1.0, 3.5, 2.0, 4.5, 3.0, 4.5)`
即在列优先的顺序,我会变成一个矩阵。
我已经试过:
val array = features.toArray // this gives an array of vectors and doesn't work
我也试着输入功能作为一个数据帧的对象,而不是一个向量,但API期待一个向量,由于特征从VectorAssembler包装。例如,该功能本身的工作原理,但并不符合API,因为它的预期FeaturesType是矢量,而不是数据帧:
def predictRaw(features: DataFrame) :DenseVector = {
val featuresArray: Array[Double] = features.rdd.map(r => r.getAs[Vector](0).toArray).collect
//rest of logic would go here
}
我的问题是features的类型Vector,不DataFrame的。另一种选择可能是打包features作为DataFrame,但我不知道如何做到这一点,而不使用VectorAssembler。