앎을 경계하기

DAFIT/906 - 머신러닝으로 당뇨병 예측

<DAFIT> 06 머신러닝을 통한 당뇨병 예측 - 05 Decision Tree를 이용한 당뇨병 예측

양갱맨 2019. 11. 26. 01:30

 

의사결정트리(Decision Tree)는 여러 분류 규칙을 적용하여 분류문제 또는 회귀문제에 적용할 수 있는 분류 모형이다.

아래 그림과 같이 트리 구조로 되어있는 분류 규칙을 따라서 classification 할 수 있다.

출처 : 위키백과

scikit-learn에서 쉽게 decision tree를 사용할 수 있도록 제공하고 있다.

from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
import pandas as pd
import numpy as np

필요 패키지들 임포트해주고,

data = pd.read_csv("/content/drive/My Drive/다핏문제/906/dataset_37_diabetes.csv")
data

데이터 불러온다.

presd = data.replace({'pres':0},{'pres':None})
presd1 = presd.dropna()
presd = data.replace({'pres':0}, {'pres':None})
presd = presd.fillna(presd1.pres.median())

massd = presd.replace({'mass':0.0},{'mass':None})
massd1 = massd.dropna()
massd = data.replace({'mass':0.0},{'mass':None})
massd = massd.fillna(massd1.mass.median())

plasd = massd.replace({'plas':0}, {'plas':None})
plasd1 = plasd.dropna()
data = plasd.fillna(plasd1.plas.median())
data

이전 문제에서 풀었던 결측치를 처리하고 학습할 feature, class feature를 분리해준다.

col = list(map(str, data.columns))
x = data[col[:-1]]
y = data[col[-1]]
print(x, y)

train/val/test data set 분리 문제에서 풀었던 대로 각 데이터집합을 나눠준다.

x_train, x_test, y_train, y_test = train_test_split(x,y,test_size=0.4)

x_test, x_val, y_test, y_val = train_test_split(x_test,y_test, test_size=0.5)

 

이제 의사결정트리를 사용해보자!

DecisionTreeClassifier()를 사용해서 의사결정트리를 사용할 수 있다.

max_depth를 설정해주지 않으면 데이터집합에 완전 overfitting해서 오히려 결과가 떨어진다.

그래서 max_depth를 적절히 설정해줬다.

fit()을 사용해서 train data set을 학습한다.

dTree = DecisionTreeClassifier(max_depth=2,random_state=0).fit(x_train,y_train)

학습한 의사결정트리에 score()를 사용해서 평균 정확도를 체크하자.

print("train score : {}".format(dTree.score(x_train, y_train)))
print("val score : {}".format(dTree.score(x_val, y_val)))

max_depth를 명시하지 않았을 때는 train score가 1이 나온다.

오히려 val score는 max_depth=2보다 낮았었다.

predict_y = dTree.predict(x_test)

from sklearn.metrics import classification_report
print(classification_report(y_test, dTree.predict(x_test)))
print("test score : {}".format(dTree.score(x_test, y_test)))

test 셋에 적용을 해봤다.

정확도 0.73으로 train/val 보다 좀 떨어졌다.

predict_y의 값을 출력해보면 어떻게 예측을 했는지 확인할 수 있다.

 

.

.

.

 

트리형태를 시각화해보자.

 import graphviz
 from sklearn.tree import export_graphviz
 
 export_graphviz(dTree, out_file='tree.dot', class_names=['positive','negative'], feature_names=data.columns[:-1], impurity=False, filled=True)

with open('tree.dot') as file_reader:
    dot_graph = file_reader.read()

dot = graphviz.Source(dot_graph)
dot.render(filename='tree.png')

max_depth를 구체적으로 적용 안했을 때

확대해서 보니 굉장히 구체적인 규칙을 통해서 decision한다.

 

max_depth에 따라 트리의 depth가 달라진다.

 

 

http://www.dafit.me/question/?q=YToxOntzOjEyOiJrZXl3b3JkX3R5cGUiO3M6MzoiYWxsIjt9&bmode=view&idx=2682894&t=board

 

[DF906] 머신러닝을 통한 당뇨병 예측 : 다핏, 데이터사이언스 연습문제

🔥 문제 설명당뇨병에 영향을 주는 8가지 특징을 바탕으로, 머신러닝 기법을 통해 당뇨병을 예측해보는 문제입니다. 🔥 추천 대상머신러닝에 많이 활용되는 SciKit-Learn을 활용하여 머신러닝 입문을 해보고 싶은 자.캐글의 타이타닉 생존자 예측 문제 수준을, 새로운 문제로 스스로 해결해보고 싶은 자.이진 분류데이터(True / False)를 활용하여 기초적인 데이터 분석과 머신러닝 기법을 체험해보고 싶은 사람.🔥 학습 목표머신러닝의 세부적인 모델링 또는

www.dafit.me