我正在遇到VectorAssembler
的非常奇怪的行为,我想知道是否还有其他人看到了这一点。
我的情况很简单。我从CSV
文件中解析数据,其中有一些标准Int
和Double
字段,并且我还计算了一些额外的列。我的解析函数返回以下内容:
val joined = countPerChannel ++ countPerSource //two arrays of Doubles joined
(label, orderNo, pageNo, Vectors.dense(joinedCounts))
我的主要功能使用如下解析功能:
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的transform函数之后,我打印了同一行数据并得到了:
[3.2,(18,[0,1,6,9,14,17],[17.0,15.0,3.0,1.0,4.0,2.0])]
到底是怎么回事?
VectorAssembler
做了什么?我仔细检查了所有计算,甚至遵循了简单的Spark示例,但看不到我的代码有什么问题。你能? 最佳答案
输出没有什么奇怪的。您的向量似乎有很多零元素,因此spark
使用了它的稀疏表示。
进一步说明:
您的向量似乎由18个元素(维度)组成。
向量中的此索引[0,1,6,9,14,17]
包含按[17.0,15.0,3.0,1.0,4.0,2.0]
顺序排列的非零元素
稀疏向量表示法是一种节省计算空间的方法,因此可以更轻松,更快地进行计算。有关稀疏表示here的更多信息。
现在,您当然可以将稀疏表示转换为密集表示,但这是有代价的。
如果您有兴趣获得功能重要性,那么我建议您看一下this。