scala – Spark ML VectorAssembler返回奇怪的输出
发布时间:2020-12-16 18:54:01 所属栏目:安全 来源:网络整理
导读:我遇到了来自VectorAssembler的非常奇怪的行为,我想知道是否有其他人看过这个. 我的场景很简单.我解析CSV文件中的数据,其中我有一些标准的Int和Double字段,我还计算了一些额外的列.我的解析函数返回: val joined = countPerChannel ++ countPerSource //two
我遇到了来自VectorAssembler的非常奇怪的行为,我想知道是否有其他人看过这个.
我的场景很简单.我解析CSV文件中的数据,其中我有一些标准的Int和Double字段,我还计算了一些额外的列.我的解析函数返回: 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","joinedCounts")) .setOutputCol("features") val assemblerData = assembler.transform(data) 因此,当我在进入VectorAssembler之前打印一行数据时,它看起来像这样: [3.2,17.0,15.0,[0.0,0.0,3.0,1.0,4.0,2.0]] 在VectorAssembler的转换函数之后,我打印同一行数据并得到: [3.2,(18,[0,1,6,9,14,17],[17.0,2.0])] 到底是怎么回事? VectorAssembler做了什么?我已经仔细检查了所有计算,甚至按照简单的Spark示例,看不出我的代码有什么问题.你能? 解决方法
输出没什么奇怪的.你的向量似乎有很多零元素,因此spark使用它的稀疏表示.
进一步解释: 看起来你的矢量由18个元素组成(维度). 来自向量的这个索引[0,17]包含非零元素,它们按顺序排列[17.0,2.0] 稀疏矢量表示是一种节省计算空间的方法,因此更容易和更快地计算.更多关于稀疏表示here. 当然,您现在可以将稀疏表示转换为密集表示,但这需要付出代价. 如果您有兴趣获得功能重要性,我建议您查看this. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |