프로젝트

03. pima indians 데이터로 의사결정나무 만들기 (python)

기계학습점쟁이 2022. 6. 9. 13:06

사용한 패키지.

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

%matplotlib inline
 
 

 

-> data 폴더에 저장한 diabates csv 파일을 사용했다. 파일 출처는 캐글. pima indians 로 검색하면 나온다. 768행짜리.

 

 

 

df.head()
 

-> 위쪽 행들을 확인해서 맞게 불러왔는지 확인해보자.

 

 

 

split_count = int(df.shape[0] * 0.8)
split_count
 

-> 데이터를 8:2 로 나누는 과정. 학습데이터셋인 train과 테스트데이터셋인 test를 8:2 비율로 나눠 줬다.

 

 

 

train = df[:split_count].copy()
train.shape
 

-> out이 (614, 9)로 나오는데 열이 614, 행이 9개라는 뜻.

 

 

 

df
 

-> df 확인해보면?

대표사진 삭제

사진 설명을 입력하세요.

이런식으로 767까지 확인됐다.

 

 

 

test = df[split_count:].copy()
test
 

-> train 데이터도 나눠줬으니 test 데이터도 나눠줘야 한다. 그래서 나눠줬다.

 

 

 

feature_names = train.columns[:-1].tolist()
feature_names
 

-> 하지만 train 데이터에서는 output 행이 빠져야 한다. 시험을 보는데 답이 있으면 안되니까... (output이 답이다. 당뇨가 걸렸는지 걸리지 않았는지 이 행에 저장된다.) train.colums[:-1]이 output을 제외하는 코드다. output은 행의 마지막에 있었기 때문에 -1을 빼주는거다.

 

 

 

label_name = train.columns[-1]
label_name
 

-> label_name 변수에 예측할 컬럼의 이름을 담기. (outcome)

 

 

 

X_train = train[feature_names]
print(X_train.shape)
X_train.head()
 

-> 학습 세트를 만들어 줬다. 시험의 기출문제로 생각하면 된다.

X_train은 기출문제. y_train은 정답.

 

 

 

y_train = train[label_name]
print(y_train.shape)
y_train.head()
 

-> 정답 값 만들기.

 

 

 

X_test = test[feature_names]
print(X_test.shape)
X_test.head()
 

-> 예측에 사용할 데이터세트 만들었다. 실전 문제.

 

 

 

y_test = test[label_name]
print(y_test.shape)
y_test.head()
 

-> 예측의 정답값. 실전 시험 문제의 정답.

 

 

 

from sklearn.tree import DecisionTreeClassifier

model = DecisionTreeClassifier()
model
 

-> 머신러닝 알고리즘 가져오기

 

 

 

model.fit(X_train, y_train)
 

-> 학습(훈련)한다.

시험을 볼 때 기출문제(X_train)와 정답(y_train)을 보고 공부하는 과정과 유사함.

 

 

 

y_predict = model.predict(X_test)
y_predict[:5]
 

-> 예측한다.

실전 시험문제(X_train)라고 보면 됨. 우리가 정답을 직접 예측함.

 

 

 

from sklearn.tree import plot_tree
plt.figure(figsize = (20,20))
tree = plot_tree(model,
         feature_names = feature_names,
                filled = True, 
                fontsize = 10)
 

-> 트리 알고리즘 분석하기.

의사결정나무 시각화.

대표사진 삭제

사진 설명을 입력하세요.

 

 

 

 

model.feature_importances_
 

-> 피처의 중요도를 추출하기.

 

 

 

sns.barplot(x=model.feature_importances_, y=feature_names)
 

-> 피처의 중요도 시각화하기

대표사진 삭제

사진 설명을 입력하세요.

이 시각화로 glucose이 당뇨에서 가장 중요도가 높다고 판단할 수 있게됨. 하지만 통상 알고 있는 당뇨병의 주요 발병 원인인 insulin의 중요도가 낮은 이유가 납득되지 않음. 후에 feature engineering으로 정확도를 높여야 함. (이 페이지에서는 하지 않을거임)

 

 

 

abs(y_test - y_predict).sum() / len(y_test)
#이 모델은 약 71퍼센트의 정확도를 가지고 있음.

diff_count = abs(y_test - y_predict).sum()
diff_count
 

-> 정확도(accuracy) 측정하기

이 모델의 성능은 어느 정도인가?

실제값 - 예측값을 빼주면 같은 값은 0으로 나오게 됨.

 

out이 45로 나옴. 45개가 틀렸다는 뜻.

 

 

 

(len(y_test) - diff_count) / len(y_test) * 100
#70점
 

-> 예측의 정확도 구하기. 100점 만점에 몇 점 맞았을까? out이 70.77922077922078로 나옴. 약 70점이라는 뜻.

하지만 이 값은 조금씩 달라진다. 의사결정나무는 랜덤으로 값을 뽑아내기 때문.

 

이렇게 직접 구할 수 있지만 미리 구현된 알고리즘을 가져와 사용해 볼 수 도 있음.

 

 

 

from sklearn.metrics import accuracy_score

accuracy_score(y_test, y_predict) * 100
 

-> sklean.matrics로 자동으로 돌린 값. 70.77922077922078. 동일한 값이 나옴.

 

 

 

model.score(X_test, y_test) * 100
 

-> model의 score로 점수를 계산하기. 70.77922077922078. 동일한 값.