해당 스터디는 Fast Campus 강의를 기반으로 진행했습니다.
- Competition 소개
- EDA
- Feature Engineering
- Machine Learning
- Submission
- Wrap-Up
Competition 소개
스터디에서 첫 번째로 진행한 Competition은 타이타닉 재난 ML이었다.
말 그대로 타이타닉과 같은 재난에서 실제로 생존자와 사망자의 데이터를 기반으로 test 데이터셋의 사람들이 사망했을지 생존했을지 예측하는 competition이었다.
기본적으로 학습에 활용할 수 있는 feature에 대한 설명도 상세하고, 분류도 단순한 binary classification이며, class의 비율이 대략 0.6:0.4로 거의 동등해 쉽게 도전해 볼 만한 competition이다.
자세한 competition 소개 및 링크는 아래를 참고!
https://www.kaggle.com/competitions/titanic/overview
EDA
EDA의 필요성
모델을 만들기 전에 먼저 진행해야 할 매우 중요하면서도 간과하기 쉬운 일을 꼽자면 EDA(Exploratory Data Analysis)와 Feature Engineering 일 것이다. 당연히 학습할 데이터를 선택하고, 이를 정제하는 작업은 모델의 성능과 매우 긴밀한 관계가 있을 수밖에 없다. 예를 들면 예측할 class의 train dataset가 imbalance 하다면 데이터를 over/under sampling 해야 할 수도 있고, 이에 맞는 ML algorithm을 선택해야 할 수 있다. 또한 학습에 사용한 feature들이 너무 많으면 차원의 저주로 인해 overfit이 되거나 학습 시간이 오래 걸리는 한계가 발생할 수도 있을 것이다.
물론 EDA가 중요한 이유는 EDA를 진행하는 과정을 통해 한 번 더 확인이 가능하다.
EDA의 진행은 대략 아래와 같이 진행될 수 있다.
|
결국 데이터셋을 확인해야 해당 데이터의 인사이트를 얻고, 가설을 세워 어떤 데이터를 기반으로 학습하고 예측하는 모델을 만들지 선택할 수 있을 것이다. (라고 말하는 필자도 이를 깨닫고 실천하기까지 1년이란 시간이 걸렸다.)
Titanic Competition EDA
Titanic에서 활용 가능한 Feature (Train/Test Dataset의 column)는 아래와 같다.
대략적으로 어떤 데이터들을 활용할 수 있고, 어떤 타입인지 확인 후, 각 feature와 추측할 값(Survived) 간의 상관관계를 확인하기 위해서 heatmap을 그려보았다. 그리고 기본적으로 문자열의 경우 heatmap에서 상관관계를 보여주지 않으므로 (수치가 아니라 확인이 불가능) 성별에 관련된 것만 임시적으로 0,1로 인코딩하여 확인해 보았다.
(당연히 다른 문자열도 전처리를 통해 인코딩할 수 있으나 이름이나 Ticket 이름, Cabin 값이 생존에 큰 영향을 미치지 않을 것 같아 우선 스킵하고 넘어갔다. 이는 추후 맨 밑에 한 번 더 정리할 예정.)
위 heatmap을 보면 Pclass, Sex, Fare 값이 Survived와 상관관계가 높은 것을 확인할 수 있었다.
Sex의 경우 양의 상관관계가 있기 때문에, 여성(1)일 수록 생존(1)한다고 해석할 수 있고, Pclass의 경우 낮을수록 생존(1) 확률이 높다고 볼 수 있으며, Fare의 경우 높을수록 생존하기 쉽다고 볼 수 있다.
여기서 Fare와 Pclass의 상관관계를 보면 -0.56으로 임의 상관관계가 높은데 이는 Pclass가 낮을수록 Fare가 높다는 것이며, 실제로 Pclass는 선실등급으로 낮을수록 운임료도 비쌀 것이다. 그렇기 때문에 학습에 Sex와 Pclass만 feature로 활용하려 한다.
실제로 Pclass와 생존의 상관관계가 어떻게 되는지 확인하기 위해서는 아래와 같이 데이터를 확인할 수 있다.
위처럼 Pclass가 낮을수록 생존율이 높음을 알 수 있다.
Feature Engineering
Feature Engineering의 필요성
EDA를 통해 가설 설정 및 확인이 되었다면 학습에 사용할 feature를 학습할 수 있는/학습하기 쉬운 형태로 전처리 작업이 필요하다. Feature Engineering 작업은 크게 아래와 같이 2가지를 꼽을 수 있다.
|
Titanic Competition Feature Engineering
학습에 사용하지 않을 feature 중 하나인 Cabin의 결측치를 확인해 보았다.
(결측치가 많기도 하고, 상관관계가 없어서 학습에 제외했다.)
학습에 사용할 Sex와 Pclass를 학습에 용이하게 One-Hot Encoding 했다.
Machine Learning
이제 학습할 feature를 선택했으므로 이를 기반으로 여러 머신러닝 알고리즘을 활용해 학습해 보고, 그 과정에서 하이퍼파라미터를 조정해 가며 성능이 높은 모델을 택했다.
학습과 테스트용 데이터를 분리한 후, 각 feature들에 대해 standardScalar를 활용하여 정규화를 진행했다.
기본 하이퍼파라미터를 활용한 knn의 성능(accuracy, recall, precision, f1-score) 측정하였다. 이때 fold=10로 하여 CV를 진행하였다. 성능이 대체로 잘 나오는 것을 확인하여 knn을 모델로 택하기로 결정했다.
모델의 성능을 높이기 위하여 GridSearchCV를 활용해 최적의 하이퍼파라미터를 찾았다.
Submission
최적의 파라미터와 모델, feature를 찾았기 때문에 해당 모델을 기준으로 예측 및 submission을 진행했다.
우선 test 기준으로 가장 최고의 정확도는 0.84였으며, 제출할 예측 결과는 titanic_submission1.csv로 저장했다.
최종 제출 결과는 0.76555고, 모델 학습 및 예측까지 대략 1분이 소요되었다.
Wrap-Up
Kaggle Notebook
https://www.kaggle.com/code/mocaaoba/titanic-summary/notebook
Sumary
- EDA를 통해 학습에 사용할 feature를 선택
- Sex, Pclass
- Feature Engineering
- 학습할 feature가 범주형/문자이기 때문에 학습에 적합하도록 one-hot encoding 진행
- Machine Learning
- 학습할 모델 선정 및 모델의 hyper parameter 설정
- Submit
- 예측 결과 제출 및 정확도 확인
사견
- EDA는 참 어려운 것 같다. 강의 기반으로 매우 매우 간단하게 코드를 짠 것이다 보니 해당 글에선 어렵게 비치지 않은 것 같지만, 실은 강의에서 보면 이름을 파싱하며 성이나 Ms, Mr와 같은 직위(혹은 직책)와 같은 값도 다 feature로 활용하고자 했었다. 혹은 결측치를 채우기 위해서 해당 값들을 기반으로 age를 추측해 채워 넣기도 했다. "이렇게 데이터를 많이 만져보고 이를 기반으로 인사이트를 얻어야 1위(강사가 캐글 1위)라 불릴만한 것이다"라는 다른 스터디원의 의견처럼 결국 모델은 학습할 데이터가 잘못되면 제대로 나올 수 없듯이, EDA가 중요하고, 이를 기반으로 feature selection 및 data 전처리 과정을 진행하는 것이 매우 중요한 것 같다.
- 실은 여러 모델을 시도하려 했으나, 장난으로 시도했던 knn의 정확도가 높아 그대로 제출했다. 그랬더니 다른 regression 모델을 시도해 보라는 추천 댓글이 달렸다. 실제 강의에서도 여러 모델을 활용했고, 이를 기반으로 앙상블도 시도했었다. 추후에 한 번 해보고 싶다. (제발...)