2

私はSparkとPythonの両方に新しいです。私はスパークを使用して、わずか2つのクラス(0と1)でロジスティック回帰モデルを訓練しました。列車のデータフレームを使って訓練しました。私lr_predictionsがどのように見える列「確率」があり、今バイナリ分類のためのロジスティック回帰のスパーク:2つのクラスを予測するための新しいしきい値の適用

lr_predictions = lrModel.transform(test) 

:私は私のテストデータフレームを使用して予測を実行した

その後
# Model definition: 
lr = LogisticRegression(featuresCol = "lr_features", labelCol = "targetvar") 
# Pipeline definition: 
lr_pipeline = Pipeline(stages = indexStages + encodeStages +[lr_assembler, lr]) 
# Fit the logistic regression model: 
lrModel = lr_pipeline.fit(train) 

は、これは私のパイプラインモデルが定義されていた方法です私にネストされたリスト。例えば、最初のセルには次のものが含まれます。 [1,2] []、[0.88,0.11]]
クラス1の確率(= 0)は0.88、クラス2の確率(= 1)は0.11である。デフォルト(閾値= 0.5)で

この観察は0として 予測される。しかし、私は(私の場合、それは0.21'S)F値を最大値(bestThreshold)の実測値:

fMeasure = lr_summary.fMeasureByThreshold 
bestThreshold = fMeasure.orderBy(fMeasure['F-Measure'].desc()).first().threshold 

I bestThresholdを 'probability'列に適用し、bestThresholdに基づいて0.5を基準にしたクラス割り当て(0または1)を含む新しい 列(たとえば 'pred_new')を取得したいとします。

「確率」列が複雑すぎるので、私は、以下のコードを使用することはできません。

from pyspark.sql.functions import when 
lr_predictions = lr_predictions.withColumn("prob_best", \ 
       when(lr_predictions["probability"] >= bestThreshold, 1).otherwise(0) 

私は新しいしきい値に基づいて新しい列に「確率」をマッピングする必要がありますする必要があります感じています。しかし、私はそれを行う方法がわかりません - この「複雑な(私にとって)」確率の列の構造を考えると、

ありがとうございました!

答えて

3

lrModelの場合はLogisticRegressionModelです:

type(lrModel) 
## pyspark.ml.classification.LogisticRegressionModel 

あなたは

lrModel._java_obj.setThreshold(bestThreshold) 

しきい値を設定し、変換するために内部Javaオブジェクトを使用することができます。

lrModel.transform(data) 

あなたはrawPredictionColを変更するために同じことを行うことができます、predictionColおよびprobabilityCol

これは、将来的にはパブリックAPIの一部になる必要があります(2.3):

lrModel.transform(data, {lrModel.threshold: bestThreshold}) 
あなたが使用することもでき

UDF:

from pyspark.sql.functions import udf, lit 

@udf("integer") 
def predict(v, threshold): 
    return 0 if v[0] >= bestThreshold else 1 

lr_predictions.withColumn(
    "prob_best", 
    predict(lr_predictions["probability"], lit(bestThreshold))) 

編集PipelineModel

ますLogisticRegressionModelyour previous questionのように)にアクセスして同じことを試みることができます。

+1

(+1)...! – desertnaut

関連する問題