LogisticRegressionModelをトレーニングした後、テストデータを変換してDFで予測DFを取得します。次に、prediction.show()を呼び出すと、出力列名は[label | features | rawPrediction | probability | prediction]
。 label
とfeatrues
の意味を知っていますが、どのように理解すればよいですかrawPrediction|probability|prediction
?
RawPrediction
は通常、直接の確率/信頼度の計算です。 Spark docsから:
可能な各ラベルの生の予測。 「生の」予測の意味はアルゴリズムによって異なる場合がありますが、直感的に、可能なラベルごとに信頼度の測定値が得られます(大きいほど信頼度が高くなります)。
Prediction
は、rawPrediction - via
argmax`の統計情報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
古いバージョンの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
は、ロジスティック関数をrawPrediction
(rawPrediction
と同じ長さの配列)に適用した結果です。prediction
は、配列probability
が最大値を取り、最も可能性の高いラベル(単一の番号)を与える引数です