2016-06-23 28 views
0

我正在處理一個分類問題,我必須使用mllib庫。 mllib中的分類算法(比方說Logistic迴歸)需要一個RDD [LabeledPoint]。 LabeledPoint只有兩個字段,一個標籤和一個特徵向量。在進行評分時(在測試集上應用我的訓練模型),我的測試實例還有其他一些我想保留的字段。例如,測試實例看起來像這樣<id, field1, field2, label, features>。當我創建LabeledPoint的RDD時,所有其他字段(id,field1和field2)都消失了,我無法將我的得分實例與原始實例關聯起來。我該如何解決這個問題。得分後,我需要知道ID和score/predicted_label。如何在Mllib中工作時保留記錄信息

這個問題在ML中不存在,因爲它使用DataFrame,我可以簡單地將另一列與分數一起添加到我的原始數據框中。

回答

1

解決您的問題的方法是RDD的map保留順序;因此,您可以使用帶有ID的RDD.zip方法。

這裏有一個答案,顯示程序

Spark MLLib Kmeans from dataframe, and back again

這是很容易獲得的成對的ID和集羣的RDD的形式:

val idPointRDD = data.rdd.map(s => (s.getInt(0), 
    Vectors.dense(s.getDouble(1),s.getDouble(2)))).cache() 
val clusters = KMeans.train(idPointRDD.map(_._2), 3, 20) 
val clustersRDD = clusters.predict(idPointRDD.map(_._2)) 
val idClusterRDD = idPointRDD.map(_._1).zip(clustersRDD) 

然後你從創建數據幀那

val idCluster = idClusterRDD.toDF("id", "cluster") 

它的工作原理是因爲地圖不會改變RDD中數據的順序,即 爲什麼只能用預測結果壓縮ID。