Spark & Hadoop/SparkML

[SparkML/Classification] 타이타닉 승객 생존 예측 분류 (Logistic Regression)

YSY^ 2023. 10. 14. 20:39

타이타닉 승객 생존 예측

  • 다운로드 링크 : https://www.kaggle.com/c/titanic 
  • 생존 혹은 비생존을 예측하는 것이라 Binary Classification을 사용 (2개 클래스 분류기)
    • Logistic Regression 사용
  • AUC (Area Under the Curve)의 값이 중요한 성능 지표가 됨 ▪
  • True Positive Rate과 False Positive Rate
    • True Positive Rate: 생존한 경우를 얼마나 맞게 예측했나? 흔히 Recall이라고 부르기도함
    • False Positive Rate: 생존하지 못한 경우를 생존한다고 얼마나 예측했나?
  • 총 892개의 레코드로 구성되며 11개의 피쳐와 레이블 필드(생존여부) 로 구성
  • 2번째 필드(Survived) 바로 예측해야하는 승객 생존 여부
필드 이름 설명
PassengerId 승객에게 주어진 일련번호
Survived 생존여부를 나타내는 레이블 정보
Pclass 티켓클래스. 1 = 1st, 2 = 2nd, 3 = 3rd
Name 승객의 이름
Gender 승객의 성별
Age 승객의 나이
SibSp 같이 승선한 형제/자매와 배우자의 수
Parch 같이 승선한 부모와 자녀의 수
Ticket 티켓 번호
Fare 운임의 값
Cabin 숙소 번호
Embarked 승선한 항구. C = Cherbourg, Q = Queenstown, S = Southampton

 

타이타닉 승객 생존 예측 모델링

1. SparkSession 생성

from pyspark.sql import SparkSession

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

2. Data Load

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

3. 데이터 확인

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

Age, Cabin 변수에 다수의 Null값이 있음. 특히 Cabin 변수는 대부분이 Null값이라 사용하기 어려움

4. 데이터 정제 

Feature 변환 방법은 해당링크 참고 : https://ysyblog.tistory.com/380

 

[SparkML] Spark ML 피쳐 변환(문자 카테고리형 데이터 처리, Scaling, Null값 채우기) (StringIndexer, OneHotEnco

피쳐 추출과 변환 피쳐 값들을 모델 훈련에 적합한 형태로 바꾸는 것을 지칭 파이썬과 다르게 각각의 feature를 모델에 넣는 것이 아닌 feature를 하나의 vector로 묶어서 모델에 넣음 크게 두 가지가

ysyblog.tistory.com

4-1) 컬럼 선별

  • PassengerID, Name, Ticket, Embarked는 사용하지 않을 예정 (아무 의미가 없음).
  • Cabin도 비어있는 값이 너무 많아서 사용하지 않을 예정
  • Age는 중요한 정보인데 비어있는 레코드들이 많아서 디폴트값을 채워줄 예정
  • Gender의 경우 카테고리 정보이기에 숫자로 인코딩 필요
final_data = data.select(['Survived', 'Pclass', 'Gender', 'Age', 'SibSp', 'Parch', 'Fare'])
final_data.show()

4-2) Age 컬럼의 Null값을 평균으로 대체

  • Imputer : Null값을 채워주는 함수. strategy에는 채우는 방법을 지정한다.
  • 모듈을 import 후, 인스턴스를 만든 후, fit을 활용하여 어떤 값으로 바꿔줘야하는 정보를 세팅하고, transform을 활용하여 데이터를 해당 인스턴스로 바꿔준다.
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)
final_data.select("Age", "AgeImputed").show()

Null값으로 되어있는 것에 평균값이 들어가 있다.

4-3) Binary 인코딩 (성별정보)

  • male은 0으로, female은 1로 바꿔준다.
  • StringIndexor라는 함수를 사용 : 카테고리마다 일련번호를 붙여준다.
from pyspark.ml.feature import StringIndexer

gender_indexer = StringIndexer(inputCol='Gender', outputCol='GenderIndexed')
gender_indexer_model = gender_indexer.fit(final_data)
final_data = gender_indexer_model.transform(final_data)
final_data.select("Gender", "GenderIndexed").show()

5. Feature Vector를 만든다.

  • 모델에 사용할 컬럼들을 선택해서 vector 컬럼으로 만들어준다.
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()

6. Train/Test data set 분리

  • randomSplit 함수를 사용한다.
  • Train set은 70%, Test Set은 30%로 지정한다.
train, test = data_vec.randomSplit([0.7, 0.3])

7. Logistic Regression Modeling

Logistic Regression 설명 포스팅 : https://ysyblog.tistory.com/83

 

[Machine Learning][머신러닝] 로지스틱 회귀(Logistic Regression)

로지스틱 회귀 (LogisticRegression) 선형회귀 알고리즘을 이용한 이진 분류 모델 Sample이 특정 클래스에 속할 확률을 추정한다. 확률 추정 선형회귀 처럼 입력 특성(Feature)에 가중치 합을 계산한 값을

ysyblog.tistory.com

from pyspark.ml.classification import LogisticRegression

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

8. 모델 성능 측정

predictions = model.transform(test)
predictions.select(['Survived','prediction', 'probability']).show()

  • AUC를 계산해본다.
from pyspark.ml.evaluation import BinaryClassificationEvaluator

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

위 포스팅은 [파이썬으로 해보는 Spark 프로그래밍 with 프로그래머스] 강의를 듣고 정리한 내용입니다

 

728x90
반응형