2016-06-23 25 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。