【问题标题】:how to keep records information when working in Mllib在 Mllib 工作时如何保存记录信息
【发布时间】:2016-10-26 08:38:50
【问题描述】:

我正在处理一个必须使用 mllib 库的分类问题。 mllib 中的分类算法(比如说逻辑回归)需要一个 RDD[LabeledPoint]。 LabeledPoint 只有两个字段,一个标签和一个特征向量。在进行评分时(在测试集上应用我训练过的模型),我的测试实例还有一些我想保留的其他字段。例如,一个测试实例看起来像这样<id, field1, field2, label, features>。当我创建 LabeledPoint 的 RDD 时,所有其他字段(id、field1 和 field2)都消失了,我无法在我的得分实例和原始实例之间建立关系。我该如何解决这个问题。评分后,我需要知道 ids 和 score/predicted_label。

这个问题在 ML 中不存在,因为它使用 DataFrame,我可以简单地在我的原始数据框中添加另一个带有分数的列。

【问题讨论】:

    标签: apache-spark apache-spark-mllib


    【解决方案1】:

    解决您的问题的方法是RDD的map方法保留顺序;因此,您可以使用带有 id 的 RDD.zip 方法。

    这是一个显示过程的答案

    Spark MLLib Kmeans from dataframe, and back again

    很容易得到RDD形式的id和cluster对:

    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)
    

    然后你从那个创建DataFrame

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

    之所以有效,是因为 map 不会改变 RDD 中数据的顺序,即 为什么你可以用预测结果压缩 id。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-23
      • 2011-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多