2017-05-11 8 views
1

モデルに各ラベルの確率スコアを持つ予測ラベルのリストを返す方法はありますか?例えばSpark ML Naive Bayesは確率で複数のクラスを予測する

特定の機能(F1、F2、F3)、 それはこのようなものを返します: LABEL1:0.50、LABEL2:0.33 ...

が火花で、それはなんとかですが?

答えて

2

はい、可能です。 rawPredictionの出力はArray[Double]で、各ラベルの確率が含まれています。

この例では、この列は配列(0.5,0.33,0.17)になります。この配列を文字列に変換するUDFを記述する必要があります。

StringIndexerを使用してラベル列をエンコードすると、結果のラベルは元のラベルと異なることに注意することが重要です。 (most frequent label gets index 0)

あなたのユースケースに合わせて似たようなことをするコードがいくつかありました。 私のコードは、各機能のトップX予測をCSVファイルとして書き込むだけです。 writeToCsvのパラメータ@dfは、Naive Bayesモデルによって変換された後でDataFrameでなければなりません。

def topXPredictions(v: Vector, labels: Broadcast[Array[String]], topX: Int): Array[String] = { 
    val labelVal = labels.value 
    v.toArray 
     .zip(labelVal) 
     .sortBy { 
     case (score, label) => score 
     } 
     .reverse 
     .map { 
     case (score, label) => label 
     } 
     .take(topX) 
    } 

    def writeToCsv(df: DataFrame, labelsBroadcast: Broadcast[Array[String]], name: String = "output"): Unit = { 
    val get_top_predictions = udf((v: Vector, x: Int) => topXPredictions(v, labelsBroadcast, x)) 

     df 
     .select(
     col("id") 
     ,concat_ws(" ", get_top_predictions(col("rawPrediction"), lit(10))).alias("top10Predictions") 
     ) 
     .orderBy("id") 
     .coalesce(1) 
     .write 
     .mode(SaveMode.Overwrite) 
     .format("com.databricks.spark.csv") 
     .option("header", "true") 
     .save(name) 
    } 
+0

これはまさに私が欲しいものです!どうもありがとう! – seiya

関連する問題