【问题标题】:Maximum value of an mllib Vector?mllib 向量的最大值?
【发布时间】:2017-10-18 20:36:01
【问题描述】:

我已经使用 mllib 使用 Apache Spark 创建了一个机器学习管道。 求值结果是一个 DataFrame,其中有一列“probability”,它是一个 mllib 概率向量(类似于 scikit-learn 中的 predict_proba)。

val rfPredictions = rfModels.bestModel.transform(testing)
val precision = evaluator.evaluate(rfPredictions)

我尝试过这样的事情但没有成功:

rfPredictions.select("probability").map{c => c.getAs[Vector](1).max}
<console>:166: error: value max is not a member of 
org.apache.spark.mllib.linalg.Vector

我想要一个具有该概率最大值的新列。有什么想法吗?

【问题讨论】:

    标签: scala apache-spark apache-spark-mllib


    【解决方案1】:

    Vector 没有max 方法。试试toArray.max

    rfPredictions.select("probability").map{ c => c.getAs[Vector](1).toArray.max }
    

    argmax:

    rfPredictions.select("probability").map{ c => {
        val v = c.getAs[Vector](1)
        v(v.argmax)
    }}
    

    要将最大值添加为新列,请定义一个 udf 并将其与 withColumn 函数一起使用:

    val max_proba_udf = udf((v: Vector) => v.toArray.max)
    
    rfPredictions.withColumn("max_prob", max_proba_udf($"probability"))
    

    【讨论】:

    • 是的,我认为这行得通。结果我得到了一个 RDD[Double],所以我不能将它添加为我的 DataFrame 中的一列。我怎样才能做到这一点?谢谢!
    【解决方案2】:

    火花 > 2.0

    使用 ml,而不是 mllib,这将在下一个方式中起作用:

    import org.apache.spark.ml.linalg.DenseVector
    
    just_another_df.select("probability").map{ c => c.getAs[DenseVector](0).toArray.max }
    

    使用 udf

    import org.apache.spark.ml.linalg.DenseVector
    
    val max_proba_udf = udf((v: DenseVector) => v.toArray.max)
    
    val rfPredictions = just_another_df.withColumn("MAX_PROB", max_proba_udf($"probability"))
    

    【讨论】:

      猜你喜欢
      • 2015-06-19
      • 2015-10-11
      • 2014-09-13
      • 1970-01-01
      • 2020-06-02
      • 2015-05-04
      • 1970-01-01
      • 1970-01-01
      • 2021-04-02
      相关资源
      最近更新 更多