타이타닉 승객 생존 예측
- 다운로드 링크 : 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
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()
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
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
반응형