Spark ML VectorAssembler returns 奇怪的输出
Spark ML VectorAssembler returns strange output
我遇到了来自 VectorAssembler
的非常奇怪的行为,我想知道是否有其他人看到过。
我的方案非常简单。我从一个 CSV
文件中解析数据,其中有一些标准的 Int
和 Double
字段,我还计算了一些额外的列。我的解析函数 returns 这个:
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 的转换函数之后,我打印同一行数据并得到:
[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]
稀疏向量表示是一种节省计算量的方法 space,因此计算起来更容易、更快。更多关于稀疏表示 here。
现在您当然可以将稀疏表示转换为密集表示,但这是有代价的。
如果您有兴趣了解特征重要性,那么我建议您看一下 。
我遇到了来自 VectorAssembler
的非常奇怪的行为,我想知道是否有其他人看到过。
我的方案非常简单。我从一个 CSV
文件中解析数据,其中有一些标准的 Int
和 Double
字段,我还计算了一些额外的列。我的解析函数 returns 这个:
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 的转换函数之后,我打印同一行数据并得到:
[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]
稀疏向量表示是一种节省计算量的方法 space,因此计算起来更容易、更快。更多关于稀疏表示 here。
现在您当然可以将稀疏表示转换为密集表示,但这是有代价的。
如果您有兴趣了解特征重要性,那么我建议您看一下