sklearn에서 제공하는 의사결정 트리 라이브러리를 사용하여 타이타닉 데이터에서 생존 예측을 해볼 것입니다.
1912년 4월 15일, 타이타닉호는 항해 도중 빙산과 충돌하여 침몰하게 됩니다. 이때 무려 2224명의 승객과 승무원 1502명이 사망했습니다. 이 사고는 국제 사회에 충격을 안겨준 역사상 가장 비극적인 재난이었습니다. 그와 동시에, 선박 안전 규정을 크게 개선하는 계기가 됐습니다.
이 사고가 큰 인명피해로 이어진 이유 중 하나는 승객을 위한 구명정이 충분하지 않았기 때문입니다. 생존은 운에 따른 결과였겠지만, 여성, 어린이 및 부유층과 같은 일부 집단은 다른 집단보다 생존율이 더 높았습니다.
그렇다면, 집단의 생존 가능성을 예측해보는 일은 의미있어 보입니다. 여기서는 머신러닝을 적용하여 어떤 종류의 사람들이 생존할 수 있는지 예측해보겠습니다. 최종 목적은 승객들의 생존 여부를 예측하는 확률을 높이는 것입니다.
데이터 필드
Survival - Survival. 0 = No, 1 = Yes
Pclass - Ticket class. 1 = 1st, 2 = 2nd, 3 = 3rd
Sex - Sex.
Age - Age in years.
SibSp - # of siblings / spouses aboard the Titanic.
Parch - # of parents / children aboard the Titanic.
Ticket - Ticket number.
Fare - Passenger fare.
Cabin - Cabin number.
Embarked - Port of Embarkation. C = Cherbourg, Q = Queenstown, S = Southampton
준비사항
1. 의사결정 트리 시각화 프로그램인 graphviz를 다운로드 받아줍니다.
http://www.graphviz.org/download/
//다운로드 받으면 bin 폴더를 환경변수로 설정해줍니다.
2. 타이타닉 침몰 데이터
https://www.kaggle.com/c/titanic/data
실습 순서
1. 데이터셋 로딩
2. 전처리
3. 학습
4. 시각화
5. 예측
1. 데이터셋 로딩
-트레이닝 데이터셋 로딩
import pandas as pd
train = pd.read_csv("data/train.csv", index_col=["PassengerId"])
print(train.shape)
train.head()
-Test 데이터셋 로딩
test = pd.read_csv("data/test.csv", index_col=["PassengerId"])
print(test.shape)
test.head()
2. 학습을 위한 전처리 과정
성별이 문자열로 구분되어있는데 남자는 0, 여자는 1로 매칭시킨다.
#전처리 과정 (인코딩)
train.loc[train["Sex"] == "male","Sex"]=0
train.loc[train["Sex"] == "female", "Sex"] = 1
탑승 게이트는 카테고리가 C,S,Q 세가지가 있고 각각 TRUE, FALSE에 매칭시켜주기 위해
One-hot Encoding방식으로 매칭시켜줍니다.
#One-hot Encoding
train["Embarked_C"]=train["Embarked"] =="C"
train["Embarked_S"]=train["Embarked"] =="S"
train["Embarked_Q"]=train["Embarked"] =="Q"
print(train.shape)
train.head()
-실행결과
테스트 데이터의 요금에 NaN 값이 있는 것이 있으므로 평균값으로 채워주도록 하겠다.
#테스트데이터의 Fare에 빈값이 들어가 있는 경우가 있으므로 평균값으로 채워준다.
mean_fare = train["Fare"].mean()
test[pd.isnull(test["Fare"])]
test.loc[pd.isnull(test["Fare"]), "Fare"] = mean_fare
test[pd.isnull(test["Fare"])]
# NaN 값이 사라졌다.
3. 학습 진행
순서는 크게 다음과 같이 진행된다.
1. 의사결정트리에 쓰일 Feature 선택
2. 예측결과를 정답과 비교하며 학습
3. 의사결정 트리 생성
1. Feature 선택
feature_names = ["Pclass", "Sex", "Fare",
"Embarked_C", "Embarked_Q", "Embarked_S"]
X_train = train[feature_names]
print(X_train.shape)
X_train.head()
2. 정답셋 준비
#정답셋 준비
label_name = "Survived"
y_train = train[label_name]
print(y_train.shape)
y_train.head()
3. sklearn의 의사결정트리 라이브러리의 DecisionTreeClassifier 모델을 호출한다.
from sklearn.tree import DecisionTreeClassifier
seed = 37
model = DecisionTreeClassifier(max_depth=5,
random_state=seed)
model.fit(X_train, y_train)
4. 의사결정트리 결과로 만들어진 트리를 시각화 시켜준다.
(조건을 따라서 최하단 leaf노드까지 가면 최종 의사가 결정된다.)
from sklearn.tree import export_graphviz
import graphviz
export_graphviz(model,
feature_names=feature_names,
class_names=["Perish", "Survived"],
out_file="decision-tree.dot")
with open("decision-tree.dot") as f:
dot_graph = f.read()
graphviz.Source(dot_graph)
5. 예측을 하기 위한 Test데이터 전처리
#예측하기 위해 test데이터도 전처리
#전처리 과정 (인코딩)
test.loc[test["Sex"] == "male","Sex"]=0
test.loc[test["Sex"] == "female", "Sex"] = 1
#One-hot Encoding
test["Embarked_C"]=train["Embarked"] =="C"
test["Embarked_S"]=train["Embarked"] =="S"
test["Embarked_Q"]=train["Embarked"] =="Q"
6. 제작한 모델을 사용하여 실제 통계와 예측해보기
#예측
X_test = test[feature_names]
prediction = model.predict(X_test)
submission = pd.read_csv("data/gender_submission.csv", index_col="PassengerId")
submission["Survived"] = prediction
print(submission.shape)
submission.head()