Spark ML VectorAssembler返回奇怪的输出

时间:2016-11-09 11:22:37

标签: scala apache-spark apache-spark-mllib apache-spark-ml

我在VectorAssembler遇到一种非常奇怪的行为,我想知道是否有其他人看过这个。

我的情景很简单。我解析了CSV文件中的数据,其中我有一些标准IntDouble字段,我还计算了一些额外的列。我的解析函数返回:

val joined = countPerChannel ++ countPerSource //two arrays of Doubles joined
(label, orderNo, pageNo, Vectors.dense(joinedCounts))

我的main函数使用解析函数,如下所示:

val parsedData = rawData.filter(row => row != header).map(parseLine)
val data = sqlContext.createDataFrame(parsedData).toDF("label", "orderNo", "pageNo","joinedCounts")

然后我使用VectorAssembler这样:

val assembler = new VectorAssembler()
                           .setInputCols(Array("orderNo", "pageNo", "joinedCounts"))
                           .setOutputCol("features")

val assemblerData = assembler.transform(data)

因此,当我在进入VectorAssembler之前打印一行数据时,它看起来像这样:

[3.2,17.0,15.0,[0.0,0.0,0.0,0.0,3.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,4.0,0.0,0.0,2.0]]

在VectorAssembler的变换功能之后,我打印同一行数据并得到这个:

[3.2,(18,[0,1,6,9,14,17],[17.0,15.0,3.0,1.0,4.0,2.0])]

到底是怎么回事? VectorAssembler做了什么?我已经仔细检查了所有的计算,甚至按照简单的Spark示例,看不出我的代码有什么问题。你能?

1 个答案:

答案 0 :(得分:13)

输出没什么奇怪的。你的向量似乎有很多零元素,因此spark使用它的稀疏表示。

进一步解释:

您的矢量似乎由18个元素(维度)组成。

向量中的这个索引[0,1,6,9,14,17]包含非零元素,这些元素按顺序[17.0,15.0,3.0,1.0,4.0,2.0]

稀疏矢量表示是一种节省计算空间的方法,因此更容易,更快速地进行计算。有关稀疏表示的更多信息here

当然,您可以将该稀疏表示转换为密集表示,但这需要付出代价。

如果您有兴趣获得功能重要性,我建议您查看this