230522 / BSA12. pyspark에서 Logistic Regression

BSA08_Pyspark-Logistic.ipynb

 

패키지 호출 및 스파크 세션 시작

from pyspark.sql import SparkSession
from pyspark.sql.types import StringType
from pyspark.ml.feature import StringIndexer, OneHotEncoder
from pyspark.ml.feature import VectorAssembler
from pyspark.ml.classification import LogisticRegression
from pyspark.ml.evaluation import BinaryClassificationEvaluator


spark =  SparkSession.builder.appName("churn").getOrCreate()
spark.conf.set("spark.sql.execution.arrow.pyspark.enabled","true")

 

데이터 불러오기

churn_df  = spark.read.csv("Telco-Customer-Churn.csv",inferSchema=True,header=True)
churn_df.show()
churn_df.printSchema()

# 변수 제거
churn_df = churn_df.drop("customerID")

# 문자형
문자변수 = [변수.name for 변수 in churn_df.schema.fields if isinstance(변수.dataType, StringType)]

# 타입 확인
indexer  = StringIndexer(inputCols=문자변수,  # input값이 하나인 경우에는 inputCol="gender"처럼 표기
                         outputCols=["{}_SI".format(c) for c in 문자변수])
encode_df  = indexer.fit(churn_df).transform(churn_df)
encode_df.printSchema()

# 기존에 integer였던 변수 3개("SeniorCitizen","tenure", "MonthlyCharges")와 
# double로 변환한 문자변수들을 합쳐 설명변수 리스트로 만듦
설명변수 = ["SeniorCitizen","tenure", "MonthlyCharges"]+["{}_SI".format(c) for c in 문자변수]

 

설명변수, 반응변수 분리

설명변수 = 설명변수[0:-1]

변수묶음 = VectorAssembler(inputCols=설명변수,outputCol="features")
변환자료  = 변수묶음.transform(encode_df)
변환자료.select("features","Churn_SI").show()

분류자료 = 변환자료.select(["features","Churn_SI"])
분류자료.show()

 

모델 적용 및 성능평가

train_data, test_data =분류자료.randomSplit([0.7, 0.3], 316)

분석모형 =  LogisticRegression(labelCol="Churn_SI").fit(train_data) 
분석모형.summary

분석모형.summary.predictions.show(truncate=False)

분석모형.summary.predictions.describe().show()

예측 = 분석모형.evaluate(test_data)
예측.predictions.show()

평가 = BinaryClassificationEvaluator(rawPredictionCol="prediction",labelCol="Churn_SI")  # (예측값, 실제값) 형태로
auc = 평가.evaluate(예측.predictions)
auc  # 범주가 2개인 경우 
# auc 1에 가까우면 설명력 good, 0에 가까우면 설명력 bad
# auc = 0.5 : 무작위로