Competition/Kaggle

[kaggle] Titanic: Machine Learning from Disaster (4)

bisi 2020. 9. 4. 12:05

캐글에서 가장 유명한 주제중 하나인 타이타닉 탑승자 생존률 구하기 데이터 분석을

 

캐글 코리아의 타이타닉 튜토리얼을 참고 하여 진행해보았다.

 

 

총 4가지 부분으로 나눴으며 순서는 아래와 같다. 

 

1) DataSet 확인 

2) EDA (Exploratory data analysis) 

3) Modeling

4) Machin Learning


 

 

 

In [49]:
import numpy as np
import pandas as pd
from pandas import Series
import matplotlib.pyplot as plt
import seaborn as sns

plt.style.use('seaborn')
sns.set(font_scale=2.5)
In [50]:
import plotly.offline as py
py.init_notebook_mode(connected=True)
import plotly.graph_objs as go
import plotly.tools as tls

import warnings
warnings.filterwarnings('ignore')

%matplotlib inline
 
In [51]:
df_train = pd.read_csv('../data/train.csv')
df_test = pd.read_csv('../data/test.csv')
# 가족수 컬럼 추가
df_train['FamilySize'] = df_train['SibSp'] + df_train['Parch'] +1 
df_test['FamilySize'] = df_test['SibSp'] + df_test['Parch'] +1 
# Fare(요금) log 함수 취하기
df_train['Fare']= df_train['Fare'].map(lambda i : np.log(i) if i > 0 else 0)
df_test['Fare']= df_test['Fare'].map(lambda i : np.log(i) if i > 0 else 0)
 

4. Building machine learning model and prediction using the trained model

In [91]:
# 머신러닝 준비
from sklearn.ensemble import RandomForestClassifier # 랜던포레스트 
from sklearn import metrics # 모델 평가를 위해
from sklearn.model_selection import train_test_split # training set 분리 
 
  • 타이타닉 문제는 target class(survived)가 있으며, target class는 0,1이루어져 있으므로 binary classification 문제이다.
  • train set의 survived를 제외한 input을 가지고 모델을 최적화 시켜 각 샘플(탑승객)의 생존 유무를 판단하는 모델을 생성한다.
  • 그 후 모델이 학습하지 않았더 test set을 input으로 주어 test set의 각 샘플(탑승객)의 생존 유무를 예측한다.
 

4.1 Preparation - Split dataset into train, valid, test set

  • 가장 먼저, 학습에 쓰일 데이터와 target label(Survived)를 분리한다.
In [92]:
X_train = df_train.drop('Survived', axis=1).values
target_label = df_train['Survived'].values 
X_test = df_test.values
In [94]:
# 실제 test set에 적용하기 전에 valid set을 생성하여 모델을 적용해본다.
# train_test_split을 사용하여 train 셋을 분리할 수 있다.
X_tr, X_vld, y_tr, y_vld = train_test_split(X_train, target_label, test_size=0.3, random_state=2018)
 
  • 랜덤포레스트는 결정트리(Decision Tree)를 기반으로 한다.
  • 랜덤포레스트 파라미터 : n_estimators, max_features, max_depth, min_samples_split, min_samples_leaf 등..
 

4. 2 Model generation and prediction

In [96]:
model = RandomForestClassifier()
model.fit(X_tr, y_tr)
prediction = model.predict(X_vld)
In [97]:
print('총 {}명 중 {:.2f}% 정확도로 생존을 맞춤'.format(y_vld.shape[0], 100 * metrics.accuracy_score(prediction, y_vld)))
 
총 268명 중 83.21% 정확도로 생존을 맞춤
 

4.3 Feature importance

  • 학습된 모델은 feature importance를 갖게 된다.
  • pandas series를 이용하면 쉽게 sorting을 하여 그래프를 그릴 수 있다.
In [101]:
from pandas import Series

feature_importance = model.feature_importances_
Series_feat_imp = Series(feature_importance, index=df_test.columns)
In [102]:
plt.figure(figsize=(8,8))
Series_feat_imp.sort_values(ascending=True).plot.barh()
plt.xlabel('Feature importance')
plt.ylabel('Feature')
plt.show()
 
 
  • 우리가 얻은 모델에서는 Fare가 가장 큰 영향렬을 가진다. 그뒤로 Inital_2, Age_cat, Set, Pclass 순으로 중요도를 가진다.
  • 위의 feature importance는 지금 이 모델에서만 해당한다. 다른 모델에서는 결과가 다르게 나올 수 있다.
  • 그러므로 통계적으로 좀더 살펴보아야한다.
  • feature importance를 가지고 좀 더 정확도가 높은 모델을 얻기 위해 featrue selection을 할 수도 있고, 좀 더 빠른 모델을 위해 feature을 제거할 수도 있다.
 

4.4 Prediction on Test Set

  • 이제 모델이 학습하지 않았던 테스트셋을 모델에 주어서 생존 여부를 예측해보자.
  • 이 결과는 실제로 submission(제출용)이므로 결과는 learnboard 에서 확인할 수 있다.
In [103]:
## 캐글에서 준 파일인 gender_submission.csv 파일을 읽어 제출 준비를 한다.
submission = pd.read_csv('../data/gender_submission.csv')
submission.head()
Out[103]:
  PassengerId Survived
0 892 0
1 893 1
2 894 0
3 895 0
4 896 1
In [105]:
# test set에 대하여 예측하고 결과를 scv 파일로 저장한다. 
prediction = model.predict(X_test)
submission['Survived'] = prediction
In [106]:
submission.to_csv('../data/my_fist_submission.csv', index = False)

소스 코드 git hub 바로가기