如何在Scala中创建特征向量?

时间:2017-07-19 07:00:11

标签: scala apache-spark dataframe

我正在阅读csv作为scala中的数据框,如下所示:

+-----------+------------+
|x          |y           |
+-----------+------------+
|          0|           0|
|          0|          33|
|          0|          58|
|          0|          96|
|          0|           1|
|          1|          21|
|          0|          10|
|          0|          65|
|          1|           7|
|          1|          28|
+-----------+------------+

然后我创建标签和特征向量,如下所示:

val assembler =  new VectorAssembler()
  .setInputCols(Array("y"))
  .setOutputCol("features")


    val output = assembler.transform(daf).select($"x".as("label"), $"features")

  println(output.show)

输出为:

+-----------+------------+ 
|label | features | 
+-----------+------------+ 
| 0.0| 0.0| 
| 0.0| 33.0| 
| 0.0| 58.0| 
| 0.0| 96.0| 
| 0.0| 1.0| 
| 0.0| 21.0| 
| 0.0| 10.0| 
| 1.0| 65.0| 
| 1.0| 7.0| 
| 1.0| 28.0| 
+-----------+------------+

但不是这样,我希望输出类似于以下格式

+-----+------------------+ 
|label| features | 
+-----+------------------+ 
| 0.0|(1,[1],[0]) | 
| 0.0|(1,[1],[33]) | 
| 0.0|(1,[1],[58]) | 
| 0.0|(1,[1],[96]) | 
| 0.0|(1,[1],[1]) | 
| 1.0|(1,[1],[21]) | 
| 0.0|(1,[1],[10]) | 
| 0.0|(1,[1],[65]) | 
| 1.0|(1,[1],[7]) | 
| 1.0|(1,[1],[28]) | 
+-----------+------------+

我试过

 val assembler =  new VectorAssembler()
      .setInputCols(Array("y").map{x => "(1,[1],"+x+")"})
      .setOutputCol("features")

但没有奏效。 任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

这不是你使用VectorAssembler的方式。

您需要提供输入列的名称。即

new VectorAssembler().setInputCols(Array("features"))

考虑到您共享的数据,您最终将面临另一个问题。如果它是一个点,它就不是一个载体。 (您的features列)

它应该与2列或更多列一起使用。即:

new VectorAssembler().setInputCols(Array("f1","f2","f3"))