본문 바로가기

데이터 분석

sklearn을 사용한 의사결정 트리 (Kaggle 타이타닉)/Wanna Be 컴잘알

728x90

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/

 

Graphviz - Graph Visualization Software

Welcome to Graphviz What is Graphviz? Graphviz is open source graph visualization software. Graph visualization is a way of representing structural information as diagrams of abstract graphs and networks. It has important applications in networking, bioinf

www.graphviz.org

GraphViz 파이썬 패키지

 

graphviz

Simple Python interface for Graphviz

pypi.org

//다운로드 받으면 bin 폴더를 환경변수로 설정해줍니다.

 

2. 타이타닉 침몰 데이터

https://www.kaggle.com/c/titanic/data

 

Titanic: Machine Learning from Disaster

Start here! Predict survival on the Titanic and get familiar with ML basics

www.kaggle.com

 

실습 순서

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()

 

728x90