2016-11-09 51 views
2

我遇到一個非常奇怪的行爲,從VectorAssembler我想知道是否有其他人看過這個。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示例,並且看不到我的代碼出了什麼問題。你可以嗎?

回答

7

輸出沒有什麼奇怪的。你的向量似乎有很多零元素,因此Apache Spark使用了你的向量的稀疏表示。

爲了進一步解釋:

好像你的載體是由18個元素(尺寸)

此指數[0,1,6,9,14,17]從載體包含非零種元素,其是爲了[17.0,15.0,3.0,1.0,4.0,2.0]

稀疏矢量的表示法是一種節省計算空間的方式,因此更容易,更快速地進行計算。更多關於稀疏表示here

現在當然你可以將稀疏表示轉換爲密集表示,但它需要付出代價。

編輯:你似乎有興趣獲得功能的重要性(從您的意見),因此我建議你看看this

+0

我可以改變嗎? – Dimitris

+0

此外,我正在使用LinearRegression算法,並希望獲得每個輸入的係數。這種稀疏表示是否使得難以得到這些係數? – Dimitris

+0

它並沒有讓它更難。您可以將稀疏矢量轉換爲稠密矢量,因爲我相信它只是一個矢量輸出,並且在索引和元素之間有一個簡單的映射。 – eliasah