ursobad
ursobad
ursobad
전체 방문자
오늘
어제
  • 분류 전체보기 (116)
    • Emotion (35)
      • 파이썬 (10)
      • 문제 (10)
      • 인공지능 기초 (15)
    • Best of the Best (3)
    • Hacking (58)
      • HackCTF (12)
      • DreamHACK (7)
      • Webhacking.kr (19)
      • Root Me (6)
      • HTB (5)
      • 기타 (7)
      • 리버싱 소수전공 (2)
    • 기능반 (16)
      • 2과제 (14)
      • 3과제 (2)
    • 기록 (3)
    • 짧은 글들 (0)
    • 기타 (1)
    • Zombie (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 파이썬
  • BoB 자기소개서
  • 앙상블
  • BoB 자기소개
  • BoB 면접
  • KNN
  • BoB 필기
  • Python
  • 구독자 전용 다시보기
  • 함수
  • Bob
  • BoB 질문
  • 머신러닝
  • OpenCV
  • 의사결정트리
  • BoB 자소서
  • BoB 11기
  • 백준
  • 얼굴검출
  • 123

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ursobad

ursobad

의사결정 트리 캐글
Emotion/인공지능 기초

의사결정 트리 캐글

2020. 9. 15. 20:45

캐글의 튜토리얼 격인 타이타닉 데이터를 의사결정트리로 분류해보자

 

sklearn을 이용하여 CART알고리즘으로 구현한다.

 

데이터 자체를 이해하고 어떤것이 중요한 데이터인지 분류하는 것보다는 sklearn을 이용하여 의사결정 트리의 CART 알고리즘 자체를 구현해 보는것이 목적이기 때문에 데이터 전처리에는 큰 비중을 두지 않고 넘어간다.

 

www.kaggle.com/c/titanic

 

Titanic: Machine Learning from Disaster

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

www.kaggle.com

위 링크에서 데이터셋을 다운받는다.

데이터 뜯어보기

import pandas as pd
#트레이닝 데이터 가져오기
train = pd.read_csv('data/titanic/train.csv')
#테스트 데이터 가져오기
test = pd.read_csv('data/titanic/test.csv')
train.info()

--출력--
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
 #   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  
 0   PassengerId  891 non-null    int64  
 1   Survived     891 non-null    int64  
 2   Pclass       891 non-null    int64  
 3   Name         891 non-null    object 
 4   Sex          891 non-null    object 
 5   Age          714 non-null    float64
 6   SibSp        891 non-null    int64  
 7   Parch        891 non-null    int64  
 8   Ticket       891 non-null    object 
 9   Fare         891 non-null    float64
 10  Cabin        204 non-null    object 
 11  Embarked     889 non-null    object 
dtypes: float64(2), int64(5), object(5)
memory usage: 83.7+ KB

#info()함수는 데이터의 자료구조를 설명해준다. 데이터 값의 타입을 보여주고, 대표적인 통계값을 요약해서 출력해준다.

결측치 확인

train.isnull().sum()

--출력--
PassengerId      0
Survived         0
Pclass           0
Name             0
Sex              0
Age            177
SibSp            0
Parch            0
Ticket           0
Fare             0
Cabin          687
Embarked         2
dtype: int64

#insull()함수는 결측치가 있는 값을 True, 없는 값을 False로 반환한다.

실습

1. 사용할 모듈을을 불러온다

데이터 처리를 위한 pandas

트리를 구현하기위한 sklearn.tree

데이터를 시각화하기 위한 import seaborn as sns

트리를 시각화 하기위한 graphviz 모듈들을 불러온다.

import pandas as pd
from sklearn.tree import DecisionTreeClassifier
import seaborn as sns
import graphviz
from sklearn.tree import export_graphviz

2. 트레이닝, 테스트 데이터셋 불러오기

pd.read_csv를 이용하여 데이터가 있는 csv파일을 불러온다.(경로는 사람마다 다르다)

#.head()는 상위 5개의 데이터들을 보여준다.

#트레이닝 데이터 가져오기
train = pd.read_csv('data/titanic/train.csv')
#테스트 데이터 가져오기
test = pd.read_csv('data/titanic/test.csv')
train.head()

#PassengerId = 승객 ID
#Survived = 생존
#Pclass = 1,2,3 등석
#sibsp = 함깨탄 사람 수
#parch = 함깨탄 가족 수
#Fare = 요금
#Cabin = 객실

3. 데이터 시각화

#sns.countplot(데이터, x축, 카테고리 분류)

sns.countplot(data=train, x="Pclass",hue="Survived") #Pclass에 대한 데이터 시각화

Pclass데이터 시각화

4. 학습

feature_name에 학습 데이터를 넣는다

feature_name = ['Pclass']
x = train[feature_name]
print(x)

--출력--
     Pclass
0         3
1         1
2         3
3         1
4         3
..      ...
886       2
887       1
888       3
889       1
890       3
[891 rows x 1 columns]

 

target에 정답 데이터를 넣는다.

target = "Survived"
y = train[target]
print(y)

--출력--
0      0
1      1
2      1
3      1
4      0
      ..
886    0
887    1
888    0
889    1
890    0
Name: Survived, Length: 891, dtype: int64

 

sklearn에 구현되어 있는 트리를 가져온다.

model = DecisionTreeClassifier()

 

fit()을 이용하여 학습시킨다.

model.fit(x,y)

 

5. 시각화

tree = export_graphviz(model,feature_names=feature_name,
                      class_names=["Perish","Survived"])
graphviz.Source(tree)

6. 제출

Pclass만으로 학습한 모델의 정확도를 알아보기 위해 캐글에 제출해보자.

 

먼저 테스트 데이터를 가져와 모델에 적용해보자.

x_test=test[feature_name] #Pclass
met = model.predict(x_test)
met

--출력--
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0,
       1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0,
       1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0,
       0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0,
       0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,
       0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0,
       0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0,
       0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0,
       1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0,
       1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0,
       0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0,
       0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0,
       1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1,
       0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0],
      dtype=int64)

 

먼저 a에 제출 데이터를 가져온다.

그리고 위에서 만들었던 met의 값을 제출데이터의 Survived에 덮어씌운다

그 후에 to_csv로 저장한다

a = pd.read_csv('data/titanic/gender_submission.csv')
a['Survived'] = met #원래 제출 데이터의 Survived을 met의 값으로 바꿈
a.to_csv("decision-tree.csv", index=False) #인덱스가 있으면 제출에서 오류가 난다

제출해보면 

0.6으로 60퍼정도라는것을 대충 알수 있다.

점수를 높히기 위해서 Pclass뿐만 아니라 다른 데이터들도 학습에 이용해보자.

7-1. 데이터 전처리

sex데이터를 보면 남자와 여자가 문자열로 저장되어있다.

이 문자열을 숫자로 바꾸어서 학습에 이용한다.

train.Sex = train.Sex.replace('male',0)
train.Sex = train.Sex.replace('female',1)
test.Sex = test.Sex.replace('male',0)
test.Sex = test.Sex.replace('female',1)

남자는 0으로 여자는 1로 변환시킨다.

그리고 트레이닝 데이터를 보면 값이 바뀐것을 볼 수 있다.

위의 feature_name에 Sex를 추가하고 제출해본다.

Sex까지 추가했을 때의 의사결정트리

 

Sex데이터까지 이용했을때

0.77, 70퍼센트로 점수가 오른것을 볼 수 있다.

예제파일

titanic_Training.ipynb
0.05MB

 

'Emotion > 인공지능 기초' 카테고리의 다른 글

랜덤 포레스트  (0) 2020.09.16
의사결정 트리 CART  (0) 2020.09.16
의사결정 트리 ID3  (1) 2020.09.15
KNN_캐글  (0) 2020.09.15
K-NN 최근접 이웃 (K-Nearest Neighbor) 알고리즘  (0) 2020.09.11
    'Emotion/인공지능 기초' 카테고리의 다른 글
    • 랜덤 포레스트
    • 의사결정 트리 CART
    • 의사결정 트리 ID3
    • KNN_캐글
    ursobad
    ursobad

    티스토리툴바