복붙노트

[HADOOP] 확률과 예측이 모든 것을 동일하게 만드는 Spark MLLib 관련 문제

HADOOP

확률과 예측이 모든 것을 동일하게 만드는 Spark MLLib 관련 문제

Tweet 감성 분석을 수행 할 목적으로 Spark MLLib에서 기계 학습을 사용하는 방법을 배우고 있습니다. 여기에서 감정 분석 데이터 세트를 얻었습니다. http://thinknook.com/wp-content/uploads/2012/09/Sentiment-Analysis-Dataset.zip

이 데이터 세트에는 긍정 또는 부정으로 분류 된 백만 개의 트윗이 포함되어 있습니다. 이 데이터 세트의 두 번째 열에는 감정이 포함되고 네 번째 열에는 트윗이 포함됩니다.

이것은 현재 PySpark 코드입니다.

import csv
from pyspark.sql import Row
from pyspark.sql.functions import rand
from pyspark.ml.feature import Tokenizer
from pyspark.ml.feature import StopWordsRemover
from pyspark.ml.feature import Word2Vec
from pyspark.ml.feature import CountVectorizer
from pyspark.ml.classification import LogisticRegression

data = sc.textFile("/home/omar/sentiment-train.csv")
header = data.first()
rdd = data.filter(lambda row: row != header)

r = rdd.mapPartitions(lambda x : csv.reader(x))
r2 = r.map(lambda x: (x[3], int(x[1])))

parts = r2.map(lambda x: Row(sentence=x[0], label=int(x[1])))
partsDF = spark.createDataFrame(parts)
partsDF = partsDF.orderBy(rand()).limit(10000)

tokenizer = Tokenizer(inputCol="sentence", outputCol="words")
tokenized = tokenizer.transform(partsDF)

remover = StopWordsRemover(inputCol="words", outputCol="base_words")
base_words = remover.transform(tokenized)

train_data_raw = base_words.select("base_words", "label")

word2Vec = Word2Vec(vectorSize=100, minCount=0, inputCol="base_words", outputCol="features")

model = word2Vec.fit(train_data_raw)
final_train_data = model.transform(train_data_raw)
final_train_data = final_train_data.select("label", "features")

lr = LogisticRegression(maxIter=10, regParam=0.3, elasticNetParam=0.8)
lrModel = lr.fit(final_train_data)

lrModel.transform(final_train_data).show()

이 명령을 사용하여 PySpark 대화식 쉘에서 이것을 실행합니다.

pyspark --master yarn --deploy-mode client --conf='spark.executorEnv.PYTHONHASHSEED=223'

(FYI : YARN, Spark 등이있는 10 개의 VM이있는 HDFS 클러스터가 있습니다)

마지막 코드 줄의 결과로 이런 일이 발생합니다.

>>> lrModel.transform(final_train_data).show()
+-----+--------------------+--------------------+--------------------+----------+
|label|            features|       rawPrediction|         probability|prediction|
+-----+--------------------+--------------------+--------------------+----------+
|    1|[0.00885206627292...|[-0.0332030500349...|[0.4917,0.5083000...|       1.0|
|    1|[0.02994908031541...|[-0.0332030500349...|[0.4917,0.5083000...|       1.0|
|    1|[0.03443818541709...|[-0.0332030500349...|[0.4917,0.5083000...|       1.0|
|    0|[0.02838905728422...|[-0.0332030500349...|[0.4917,0.5083000...|       1.0|
|    1|[0.00561632859171...|[-0.0332030500349...|[0.4917,0.5083000...|       1.0|
|    0|[0.02029798456545...|[-0.0332030500349...|[0.4917,0.5083000...|       1.0|
|    1|[0.02020387646293...|[-0.0332030500349...|[0.4917,0.5083000...|       1.0|
|    1|[0.01861085715063...|[-0.0332030500349...|[0.4917,0.5083000...|       1.0|
|    1|[0.00212163510598...|[-0.0332030500349...|[0.4917,0.5083000...|       1.0|
|    0|[0.01254413221031...|[-0.0332030500349...|[0.4917,0.5083000...|       1.0|
|    0|[0.01443821341672...|[-0.0332030500349...|[0.4917,0.5083000...|       1.0|
|    0|[0.02591390228879...|[-0.0332030500349...|[0.4917,0.5083000...|       1.0|
|    1|[0.00590923184063...|[-0.0332030500349...|[0.4917,0.5083000...|       1.0|
|    0|[0.02487089103516...|[-0.0332030500349...|[0.4917,0.5083000...|       1.0|
|    0|[0.00999667861365...|[-0.0332030500349...|[0.4917,0.5083000...|       1.0|
|    0|[0.00416736607439...|[-0.0332030500349...|[0.4917,0.5083000...|       1.0|
|    0|[0.00715923445144...|[-0.0332030500349...|[0.4917,0.5083000...|       1.0|
|    0|[0.02524911996890...|[-0.0332030500349...|[0.4917,0.5083000...|       1.0|
|    1|[0.01635813603934...|[-0.0332030500349...|[0.4917,0.5083000...|       1.0|
|    0|[0.02773649083489...|[-0.0332030500349...|[0.4917,0.5083000...|       1.0|
+-----+--------------------+--------------------+--------------------+----------+
only showing top 20 rows

수동으로 만든 작은 데이터 세트로 동일한 작업을 수행하면 작동합니다. 나는 무슨 일이 일어나고 있는지 모르겠다.

어떤 제안?

시간 내 줘서 고마워!

해결법

  1. ==============================

    1.TL; DR 10 회 반복은 실제 응용 분야에서 낮게 유지되는 방법입니다. 크고 중요한 데이터 집합에서는 수렴하는 데 수천 번 이상의 반복 (잔여 매개 변수 조정)이 필요할 수 있습니다.

    TL; DR 10 회 반복은 실제 응용 분야에서 낮게 유지되는 방법입니다. 크고 중요한 데이터 집합에서는 수렴하는 데 수천 번 이상의 반복 (잔여 매개 변수 조정)이 필요할 수 있습니다.

    이항 LogisticRegressionModel에는 요약 속성이있어 LogisticRegressionSummary 객체에 액세스 할 수 있습니다. 다른 유용한 측정 항목 중에는 훈련 과정을 디버깅하는 데 사용할 수있는 objectiveHistory가 포함됩니다.

    import matplotlib.pyplot as plt
    
    lrm = LogisticRegression(..., family="binomial").fit(df)
    plt.plot(lrm.summary.objectiveHistory)
    
    plt.show()
    
  2. from https://stackoverflow.com/questions/44480077/issue-with-spark-mllib-that-causes-probability-and-prediction-to-be-the-same-for by cc-by-sa and MIT license