2015-12-02 58 views
0

我在Spark MLlib中使用了訓練數據構建的分類模型。現在我想用它來預測未標記的數據。將分類測試數據加載到Apache Spark中的稀疏矢量中

我有我的特點(沒有標籤)LIBSVM格式。這是我的未標記數據如何的示例

1:1 18:1 
4:1 32:1 
2:1 8:1 33:1 
1:1 6:1 11:1 
1:1 2:1 8:1 28:1 

我將這些功能保存在HDFS上的文本文件中。我如何將它們加載到RDD [Vector]中,以便將它們傳遞給model.predict()?

我使用Scala進行編碼。

謝謝。

+0

地圖,分上的空間,各執:創建一個稀疏矢量 – eliasah

+0

你怎麼知道電話號碼來自'LIBSVM'文件的數據維度? –

+1

他需要2遍數據。 – eliasah

回答

2

這裏是一個解決方案,考慮索引是基於一個和升序。

讓我們創建一些類似於文本文件中的虛擬數據。

val data = sc.parallelize(Seq("1:1 18:1", "4:1 32:1", "2:1 8:1 33:1", "1:1 6:1 11:1", "1:1 2:1 8:1 28:1")) 

現在,我們可以將數據轉換成一對RDD與指數和值。

val parsed = data.map(_.trim).map { line => 
    val items = line.split(' ') 
    val (indices, values) = items.filter(_.nonEmpty).map { item => 
    val indexAndValue = item.split(':') 
    val index = indexAndValue(0).toInt - 1 // Convert 1-based indices to 0-based. 
    val value = indexAndValue(1).toDouble 
    (index, value) 
    }.unzip 

    (indices.toArray, values.toArray) 
} 

獲取的功能

val numFeatures = parsed.map { case (indices, values) => indices.lastOption.getOrElse(0) }.reduce(math.max) + 1 

的數量和最終創建載體

val vectors = parsed.map { case (indices, values) => Vectors.sparse(numFeatures, indices, values) } 

vectors.take(10) foreach println 
// (33,[0,17],[1.0,1.0]) 
// (33,[3,31],[1.0,1.0]) 
// (33,[1,7,32],[1.0,1.0,1.0]) 
// (33,[0,5,10],[1.0,1.0,1.0]) 
// (33,[0,1,7,27],[1.0,1.0,1.0,1.0]) 
相關問題