【问题标题】:Spark ML VectorAssembler returns strange outputSpark ML VectorAssembler 返回奇怪的输出
【发布时间】:2017-03-23 04:40:13
【问题描述】:

我遇到了来自 VectorAssembler 的一个非常奇怪的行为,我想知道是否有其他人看到过这个。

我的场景非常简单。我从CSV 文件中解析数据,其中有一些标准的IntDouble 字段,并且我还计算了一些额外的列。我的解析函数返回这个:

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 示例,但看不出我的代码有什么问题。你可以吗?

【问题讨论】:

    标签: scala apache-spark apache-spark-mllib apache-spark-ml


    【解决方案1】:

    输出没有什么奇怪的。你的向量似乎有很多零元素,因此spark 使用了它的稀疏表示。

    进一步解释:

    您的矢量似乎由 18 个元素(维度)组成。

    该向量中的索引[0,1,6,9,14,17] 包含非零元素,它们按顺序排列[17.0,15.0,3.0,1.0,4.0,2.0]

    稀疏向量表示是一种节省计算空间的方法,因此计算更容易、更快。更多关于稀疏表示here

    当然,您可以将稀疏表示转换为密集表示,但这是有代价的。

    如果您有兴趣了解功能重要性,建议您查看this

    【讨论】:

    • 我可以改变吗?
    • 另外我正在使用线性回归算法并希望获得每个输入的系数。这种稀疏表示是否会使获得这些系数变得更加困难?
    • 它不会让它变得更难。您可以将稀疏向量转换为密集向量,因为我相信它只是一个向量输出,在索引和元素之间有一个简单的映射 a zip。
    • 我在我的手机上,我现在不能编码,但它是一个单行代码。
    • 非常感谢您澄清这一点。所以当我得到我的系数输出时,我会得到每个输入的所有系数吗?还是我会得到不同的表示?
    猜你喜欢
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-21
    • 2016-08-30
    • 2010-10-25
    • 2016-10-11
    • 1970-01-01
    相关资源
    最近更新 更多