2017-10-18 134 views
1

我使用mllib創建了一個使用Apache Spark的ML管道。 評估結果是一個DataFrame,其中有一列「probability」,它是概率的mllib向量(​​類似於scikit-learn中的predict_proba)。mllib矢量的最大值?

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 

我想這個概率最大的新列。有任何想法嗎?

回答

3

載體沒有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")) 
+0

是的,我認爲作品。作爲結果,我得到了一個RDD [Double],所以我無法將其添加爲DataFrame中的列。我怎樣才能做到這一點?謝謝! – marlanbar

1

星火> 2.0

隨着毫升,不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"))