web-dev-qa-db-ja.com

Spark MLlib?

LogisticRegressionModelをトレーニングした後、テストデータを変換してDFで予測DFを取得します。次に、prediction.show()を呼び出すと、出力列名は[label | features | rawPrediction | probability | prediction]labelfeatruesの意味を知っていますが、どのように理解すればよいですかrawPrediction|probability|prediction

15
Star Lee

RawPredictionは通常、直接の確率/信頼度の計算です。 Spark docsから:

可能な各ラベルの生の予測。 「生の」予測の意味はアルゴリズムによって異なる場合がありますが、直感的に、可能なラベルごとに信頼度の測定値が得られます(大きいほど信頼度が高くなります)。

Predictionは、rawPrediction - viaargmax`の統計情報modeを検索した結果です。

  protected def raw2prediction(rawPrediction: Vector): Double =
          rawPrediction.argmax

Probabilityは、各クラスのconditional probabilityです。これがscaladocです:

生の予測を与えられた各クラスの確率を推定し、
インプレースで計算を行います。これらの予測は、クラスの条件付き確率とも呼ばれます。

実際の計算は、使用しているClassifierによって異なります。

DecisionTree

生の予測のベクトルを正規化して、多項確率ベクトルにします。

インスタンス全体のクラスごとに合計し、インスタンスの総数で割ります。

 class_k probability = Count_k/Count_Total

LogisticRegression

ロジスティック式を使用しています

 class_k probability: 1/(1 + exp(-rawPrediction_k))

Naive Bayes

 class_k probability = exp(max(rawPrediction) - rawPrediction_k)

Random Forest

 class_k probability = Count_k/Count_Total
13
javadba

古いバージョンのSpark javadocs (例:1.5.x))では、以前は次の説明がありました。

「生の」予測の意味はアルゴリズムによって異なる場合がありますが、直感的に、可能なラベルごとに信頼度の測定値が得られます(大きいほど信頼度が高くなります)。

それ以降のバージョンにはありませんが、Scala ソースコード で見つけることができます。

とにかく、そして不幸な言い回しはさておき、Spark ML、ロジスティック回帰の場合のMLのrawPrecictionsは、残りの世界が logits 、つまり、ロジスティック回帰分類器の生の出力。これは、次に logistic functionexp(x)/(1+exp(x))を使用して確率スコアに変換されます。

Pysparkのおもちゃのデータの例を次に示します。

spark.version
# u'2.2.0'

from pyspark.ml.classification import LogisticRegression
from pyspark.ml.linalg import Vectors
from pyspark.sql import Row
df = sqlContext.createDataFrame([
     (0.0, Vectors.dense(0.0, 1.0)),
     (1.0, Vectors.dense(1.0, 0.0))], 
     ["label", "features"])
df.show()
# +-----+---------+
# |label| features|
# +-----+---------+
# |  0.0|[0.0,1.0]|
# |  1.0|[1.0,0.0]|
# +-----+---------+

lr = LogisticRegression(maxIter=5, regParam=0.01, labelCol="label")
lr_model = lr.fit(df)

test = sc.parallelize([Row(features=Vectors.dense(0.2, 0.5)),
                       Row(features=Vectors.dense(0.5, 0.2))]).toDF()
lr_result = lr_model.transform(test)
lr_result.show(truncate=False)

結果は次のとおりです。

+---------+----------------------------------------+----------------------------------------+----------+ 
|features |                          rawPrediction |                            probability |prediction|
+---------+----------------------------------------+----------------------------------------+----------+ 
|[0.2,0.5]|[0.9894187891647654,-0.9894187891647654]|[0.7289731070426124,0.27102689295738763]|      0.0 |
|[0.5,0.2]|[-0.9894187891647683,0.9894187891647683]|[0.2710268929573871,0.728973107042613]  |      1.0 | 
+---------+----------------------------------------+----------------------------------------+----------+

rawPredictionのロジスティック関数がprobability列を提供することを確認します。

import numpy as np

x1 = np.array([0.9894187891647654,-0.9894187891647654])
np.exp(x1)/(1+np.exp(x1))
# array([ 0.72897311, 0.27102689])

x2 = np.array([-0.9894187891647683,0.9894187891647683])
np.exp(x2)/(1+np.exp(x2))
# array([ 0.27102689, 0.72897311])

つまり、これは実際にそうです


したがって、3つの出力列すべてについて要約すると、次のようになります。

  • rawPredictionは、ロジスティック回帰分類器の生の出力です(長さがクラスの数と等しい配列)。
  • probabilityは、ロジスティック関数をrawPredictionrawPredictionと同じ長さの配列)に適用した結果です。
  • predictionは、配列probabilityが最大値を取り、最も可能性の高いラベル(単一の番号)を与える引数です
2
desertnaut