2

나는 Spark와 Python을 처음 접한다. 저는 Spark를 사용하여 단지 2 개의 클래스 (0과 1)로 Logistic Regression 모델을 교육 시켰습니다. 나는 기차 데이터 프레임을 사용하여 그것을 훈련했다. 내 lr_predictions이처럼 보이는 열 '가능성'이 지금바이너리 분류를위한 스파크 로지스틱 회귀 : 2 클래스를 예측하기위한 새로운 임계 값 적용

lr_predictions = lrModel.transform(test) 

: 내 테스트 dataframe을 사용하여 예측을 실행

다음
# 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이다. 은 F-측정을 극대화 기본적으로

(임계 값 = 0.5)이 관찰 그러나, 나는 값 (bestThreshold)을 발견 0으로 예측된다 (내 경우에 그것은 0.21의) :

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

I bestThreshold를 '확률'열에 적용하고 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입니다 : rawPredictionCol를 수정하는이 같은 작업을 수행 할 수 있습니다

lrModel.transform(data) 

을 :

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

당신은 임계 값을

lrModel._java_obj.setThreshold(bestThreshold) 

을 설정하는 내부 자바 객체를 사용하여 변환 할 수 있습니다 , predictionColprobabilityCol.

이 미래의 공개 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

당신 LogisticRegressionModel (예 : your previous question)에 액세스하여 동일한 작업을 수행 할 수 있습니다.

+1

(+1) ...! – desertnaut