scala - Spark ML VectorAssembler 返回奇怪的输出

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

我遇到了来自 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 示例,但看不出我的代码有什么问题。你是否可以?

最佳答案

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

进一步解释:

看起来您的向量由 18 个元素(维度)组成。

该指数[0,1,6,9,14,17]来自向量的非零元素按顺序排列 [17.0,15.0,3.0,1.0,4.0,2.0]
稀疏向量表示是一种节省计算空间从而更容易和更快计算的方法。更多关于稀疏表示 here .

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

如果您对获取特征重要性感兴趣,我建议您查看 this .

关于scala - Spark ML VectorAssembler 返回奇怪的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40505805/

相关文章:

python - 将行格式化为向量,如何reduceByKey (list(n_1, m_1)....(n_k, m_k)) 到 (n_1...n_k) (m_1...m_k))

apache-spark - Spark.ml 回归不计算与 scikit-learn 相同的模型

java - org.apache.xbean.asm5.ClassReader 中的 Spark Java IllegalArgumentException

scala - Akka actor 杀死/重启行为

scala - 如何在Scala中用更少的括号写f(g(h(x)))?

apache-spark - 如何在 spark-shell 中设置 spark.akka.frameSize?

apache-spark - Zeppelin 是如何集成到 spark 中的?

scala - 如何在 Scala 中为案例类参数生成值

scala - 在 scala 中对嵌套 Map 进行平面映射

scala - 数据框上的 FPGrowth?