加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读