이번에는 두번째로 데이콘과 캐글에서 유명한 타이타닉 생존자 예측을 하였다.
https://dacon.io/competitions/open/235539/data
타이타닉은 역사상 가장 유명한 난파선 중 하나로, 어떤 승객이 생존했을지 예측하는 대회이다.
데이터 설명
movies_train.csv / movies_test.csv
- PassengerID : 탑승객 고유 아이디
- Survival : 탑승객 생존 유무 (0: 사망, 1: 생존)
- Pclass : 등실의 등급
- Name : 이름
- Sex : 성별
- Age : 나이
- Sibsp : 함께 탐승한 형제자매, 아내, 남편의 수
- Parch : 함께 탐승한 부모, 자식의 수
- Ticket :티켓 번호
- Fare : 티켓의 요금
- Cabin : 객실번호
- Embarked : 배에 탑승한 항구 이름 ( C = Cherbourn, Q = Queenstown, S = Southampton)
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')
import platform
from matplotlib import font_manager, rc
plt.rcParams['axes.unicode_minus'] = False
if platform.system() == 'Darwin':
rc('font', family='AppleGothic')
print('Mac version')
elif platform.system() == 'Windows':
path = "c:/Windows/Fonts/malgun.ttf"
font_name = font_manager.FontProperties(fname=path).get_name()
rc('font', family=font_name)
print('Windows version')
else:
print('Unknown system... sorry~~~~')
train = pd.read_csv("./2. 타이타닉/train.csv")
test = pd.read_csv('./2. 타이타닉/test.csv')
submission = pd.read_csv('./2. 타이타닉/submission.csv')
EDA
train.info()
test.info()
train의 경우 Age(나이), Cabin(객실번호),Embarked(항구 이름)의 결측치가 존재한다.
test의 경우 또한 Age(나이), Cabin(객실번호),Fare(요금)의 결측치가 존재한다.
Name
train = train.drop(['Name'],axis=1)
test = test.drop(['Name'],axis=1)
이름은 생존자 예측하는데 있어 큰 도움이 되지 않기에 제거하였다.
Age
train.groupby('Pclass')['Age'].mean()
test.groupby('Pclass')['Age'].mean()
train['Age'] = train['Age'].fillna(train.groupby('Pclass')['Age'].transform('mean'))
test['Age'] = test['Age'].fillna(test.groupby('Pclass')['Age'].transform('mean'))
Age의 경우 mean값으로 결측치를 각 train,test 셋에 적용하였다.
train = train.astype({'Age':'int'})
test = test.astype({'Age':'int'})
float64인 Datatype을 int로 변환시켰다.
SEX
Sex의 경우 female(여자)는 1, male(남자)는 0으로 대체하였다.
# Sex를 수치형으로 변경
train['Sex']=train['Sex'].map({'male':0, 'female':1})
test['Sex']=test['Sex'].map({'male':0, 'female':1})
Fare
test = test.dropna(subset = ['Fare'])
Fare의 경우 1개의 값만 test에 있으므로 제거하였다.
Embarked
train['Embarked'].value_counts()
train['Embarked'].fillna(value='S', inplace=True)
S가 최빈값으로 결측치 2개의 값을 S로 대체하였다. 또한 dummie 함수처리하였다.
Pclass의 경우 또한 일등급, 이등급 등등으로 나뉘기 때문에 dummie 함수처리하였다.
train = pd.get_dummies(columns=['Embarked'],data=train)
test = pd.get_dummies(columns=['Embarked'],data=test)
train = pd.get_dummies(columns=['Pclass'],data=train)
test = pd.get_dummies(columns=['Pclass'],data=test)
마지막 데이터 점검
train.info()
test.info()
Cabin,ticket의 경우 의미가 없다고 생각했기에 제거하였다.
train = train.drop(['PassengerId','Cabin','Ticket'],axis=1)
test = test.drop(['Cabin','Ticket'],axis=1)
X와 y 분리
X_train = train.drop('Survived',axis=1)
y_train = train['Survived']
X_test = test.drop('PassengerId',axis=1)
데이터 모델 적용
from sklearn.svm import SVC, LinearSVC
from sklearn.ensemble import RandomForestClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import AdaBoostClassifier
from xgboost import XGBClassifier
Randomforest 적용
random_forest = RandomForestClassifier(n_estimators=100)
random_forest.fit(X_train, y_train)
Y_pred = random_forest.predict(X_test)
random_forest.score(X_train, y_train)
0.9820426487093153
SVC 적용
svc = SVC()
svc.fit(X_train, y_train)
Y_pred = svc.predict(X_test)
svc.score(X_train, y_train)
0.6812570145903479
KNeighbors 적용
knn = KNeighborsClassifier(n_neighbors = 3)
knn.fit(X_train, y_train)
Y_pred = knn.predict(X_test)
knn.score(X_train, y_train)
0.8406285072951739
DecisionTree 적용
tree = DecisionTreeClassifier()
tree.fit(X_train, y_train)
Y_pred = tree.predict(X_test)
tree.score(X_train, y_train)
0.9820426487093153
AdaBoost 적용
ada = AdaBoostClassifier()
ada.fit(X_train, y_train)
Y_pred = ada.predict(X_test)
ada.score(X_train, y_train)
0.8271604938271605
XGBoost 적용
xgb = XGBClassifier()
xgb.fit(X_train, y_train)
Y_pred = xgb.predict(X_test)
xgb.score(X_train, y_train)
0.9674523007856342
score를 보면, Randomforest = DecisionTree > XGBoost > KNeighbors > Adaboost > SVC 임을 알 수 있고, Randomforest와 DecisionTree가 같은 이유는 Randomforest의 디폴트값에 DecisionTree를 이용하기때문이라고 볼 수 있다.
마지막 submission에는 XGBoost의 모델을 사용했다.
마지막 submission 적용
xgb = XGBClassifier()
xgb.fit(X_train, y_train)
Y_pred = xgb.predict(X_test)
xgb.score(X_train, y_train)
submission = pd.DataFrame({
"PassengerId": test["PassengerId"],
"Survived": Y_pred
})
submission.to_csv('titanic.csv', index=False)
'공부하는 습관을 들이자' 카테고리의 다른 글
#공부일지 1_1. Introduction to Machine Learning in Production (Coursera) (0) | 2022.11.16 |
---|---|
XGBoost vs Randomforest (0) | 2022.06.29 |
[Dacon study] 1. 영화 관객수 예측 모델 개발 (0) | 2022.02.14 |