Scala Spark ML矢量汇编程序返回奇怪的输出
我在Scala Spark ML矢量汇编程序返回奇怪的输出,scala,apache-spark,apache-spark-mllib,apache-spark-ml,Scala,Apache Spark,Apache Spark Mllib,Apache Spark Ml,我在VectorAssembler中遇到了一种非常奇怪的行为,我想知道是否有其他人见过这种情况 我的情况很简单。我解析来自CSV文件的数据,其中有一些标准的Int和Double字段,我还计算一些额外的列。我的解析函数返回以下内容: val joined = countPerChannel ++ countPerSource //two arrays of Doubles joined (label, orderNo, pageNo, Vectors.dense(joinedCounts)) M
VectorAssembler
中遇到了一种非常奇怪的行为,我想知道是否有其他人见过这种情况
我的情况很简单。我解析来自CSV
文件的数据,其中有一些标准的Int
和Double
字段,我还计算一些额外的列。我的解析函数返回以下内容:
val joined = countPerChannel ++ countPerSource //two arrays of Doubles joined
(label, orderNo, pageNo, Vectors.dense(joinedCounts))
My main函数使用如下解析函数:
val parsedData = rawData.filter(row => row != header).map(parseLine)
val data = sqlContext.createDataFrame(parsedData).toDF("label", "orderNo", "pageNo","joinedCounts")
val assembler = new VectorAssembler()
.setInputCols(Array("orderNo", "pageNo", "joinedCounts"))
.setOutputCol("features")
val assemblerData = assembler.transform(data)
[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]]
然后我使用矢量汇编程序
,如下所示:
val parsedData = rawData.filter(row => row != header).map(parseLine)
val data = sqlContext.createDataFrame(parsedData).toDF("label", "orderNo", "pageNo","joinedCounts")
val assembler = new VectorAssembler()
.setInputCols(Array("orderNo", "pageNo", "joinedCounts"))
.setOutputCol("features")
val assemblerData = assembler.transform(data)
[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]]
因此,当我在数据进入矢量汇编程序之前打印一行数据时,它看起来如下所示:
val parsedData = rawData.filter(row => row != header).map(parseLine)
val data = sqlContext.createDataFrame(parsedData).toDF("label", "orderNo", "pageNo","joinedCounts")
val assembler = new VectorAssembler()
.setInputCols(Array("orderNo", "pageNo", "joinedCounts"))
.setOutputCol("features")
val assemblerData = assembler.transform(data)
[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])]
到底发生了什么事?矢量汇编程序做了什么?我已经仔细检查了所有的计算,甚至遵循了简单的Spark示例,看不出我的代码有什么问题。你能吗 输出没有什么奇怪的。你的向量似乎有很多零元素,因此spark
使用了它的稀疏表示
进一步解释:
看起来你的向量是由18个元素(维度)组成的
向量中的索引[0,1,6,9,14,17]
包含按顺序排列的非零元素[17.0,15.0,3.0,1.0,4.0,2.0]
稀疏向量表示是一种节省计算空间的方法,因此计算更容易、更快。更多关于稀疏表示的信息
现在当然可以将稀疏表示转换为密集表示,但这需要付出代价
如果您对获取特征重要性感兴趣,那么我建议您查看一下。我可以更改吗?另外,我正在使用线性回归算法,希望获取每个输入的系数。这种稀疏表示法会使获得这些系数变得更困难吗?它不会使获得这些系数更困难。你可以将稀疏向量转换为稠密向量,因为我相信它只是一个向量输出,在索引和元素之间有一个简单的映射。我在手机上,我现在无法编码,但这是一段单行代码。非常感谢你澄清这一点。所以当我得到我的系数输出时,我会得到每个输入的所有系数吗?或者我会得到一个不同的代表?