의사결정트리(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가 달라진다.
'DAFIT > 906 - 머신러닝으로 당뇨병 예측' 카테고리의 다른 글
<DAFIT> 06 머신러닝을 통한 당뇨병 예측 - 07 Feature Importance (0) | 2019.11.26 |
---|---|
<DAFIT> 06 머신러닝을 통한 당뇨병 예측 - 06 Random Forest를 이용한 당뇨병 예측 (0) | 2019.11.26 |
<DAFIT> 06 머신러닝을 통한 당뇨병 예측 - 04 데이터 분할 (0) | 2019.11.24 |
<DAFIT> 06 머신러닝을 통한 당뇨병 예측 - 03 데이터 시각화 (0) | 2019.11.24 |
<DAFIT> 06 머신러닝을 통한 당뇨병 예측 - 02 NaN값,NULL 값 처리하기 (+ 삽질연속, 실망스러운 결과..) (0) | 2019.11.23 |