본문 바로가기

프로그래머스 데브 코스/TIL

[6기] 프로그래머스 인공지능 데브코스 79일차 TIL

1118

[13주차 - Day5] Spark

Spark 3

타이타닉 생존 예측 모델
# 실습

필요한 패키지 다운로드

!pip install pyspark==3.0.1 py4j==0.10.9

Spark 생성

from pyspark.sql import SparkSession

spark = SparkSession \
    .builder \
    .appName("Titanic Binary Classification example") \
    .getOrCreate()

데이터셋 다운로드

!wget https://s3-geospatial.s3-us-west-2.amazonaws.com/titanic.csv

data = spark.read.csv('./titanic.csv', header=True, inferSchema=True)

data.printSchema() # 데이터셋 스키마 확인
data.show() # 데이터셋 형태 확인

변형해야 할 데이터 존재 확인

data.select(['*']).describe().show()

데이터 클린업

# PassengerID, Name, Ticket, Embarked는 사용하지 않을 예정 (아무 의미 없음)
# Cabin도 비어 있는 값이 너무 많아서 사용하지 않을 예정
# Age는 중요한 정보인데 비어 있는 레코드가 많아서 디폴트값을 채워 줄 예정
# Gender의 경우 카에고리 정보이기에 숫자로 인코딩 필요

final_data = data.select(['Survived', 'Pclass', 'Gender', 'Age', 'SibSp', 'Parch', 'Fare'])


# Age는 평균값으로 채운다

from pyspark.ml.feature import Imputer

imputer = Imputer(strategy='mean', inputCols=['Age'], outputCols=['AgeImputed'])
imputer_model = imputer.fit(final_data)
final_data = imputer_model.transform(final_data)


# 성별 정보 인코딩: male -> 0, female -> 1

from pyspark.ml.feature import StringIndexer

gender_indexer = StringIndexer(inputCols=['Gender'], outputCols=['GenderIndexed'])
gender_indexer_model = gender_indexer.fit(final_data)
final_data = gender_indexer_model.transform(final_data)

피쳐 벡터 만들기

from pyspark.ml.feature import VectorAssembler

assembler = VectorAssembler(inputCols=['Pclass', 'SibSp', 'Parch', 'Fare', 'AgeImputed', 'GenderIndexed'], outputCol="features")
data_vec = assembler.transform(final_data)

data_vec.show() # 제일 마지막에 추가된 feature 행 확인

훈련용과 테스트용 데이터를 나누고 Binary classification 모델 만들기

train, test = data_2.randomSplit([0.7, 0.3])

from pyspark.ml.classification import LogisticRegression

algo = LogisticRegression(featuresCol="features", labelCol="Survived")
model = algo.fit(train)

모델 성능 측정

predictions = model.transform(test)

predictions.select(['Survived', 'prediction', 'probability']).show()

from pyspark.ml.evaluation import BinaryClassificationEvaluator

evaluator = BinaryClassificationEvaluator(labelCol='Survived', metricName='areaUnderROC')
evaluator.evaluate(predictions)