본문 바로가기
python/Machine learning

Breast Cancer Detection with Decision tree

by 드럭인포메이션 2020. 7. 17.

오늘 포스팅할 내용은 Decision tree입니다.

 


1. 필요 모듈 설정

import numpy as np
import pandas as pd
import os
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn import tree
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.metrics import confusion_matrix

2. Data load

url = "https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data"
names = ['id', 'clump_thickness', 'uniform_cell_size', 'uniform_cell_shape','marginal_adhesion',  'single_epithelial_size', 'bare_nuclei','bland_chromatin', 'normal_nucleoli', 'mitoses', 'class']
df=pd.read_table(url,sep=',',names=names)
df.drop(['id'],1,inplace=True)
df.replace('?','-2',inplace=True)

데이터 분포의 경우 다른 포스팅을 참고해주세요. 데이터들의 분포를 보면서 공부하는 것은 데이터분석시에 많이 도움이 됩니다.

 

3. train set, test set 만들기

X=np.array(df.drop(['class'],1))
y=np.array(df['class'])
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25,random_state=7054)

 

 

4. 모델 생성 및 검정

 

Decision tree에서는 tree를 만들때두가지 기준으로 분석되어 만들어집니다.

 

gini와 entropy 주로 사용되는 것은 gini라고 알려져있으나, 이번 포스팅에서는 둘다 진행해보도록 하겠습니다. (최적화는 추후에 진행)

df_model1=tree.DecisionTreeClassifier(criterion='entropy',random_state=7054)
df_model2=tree.DecisionTreeClassifier(random_state=7054)
df_model1.fit(X_train,y_train)
df_model2.fit(X_train,y_train)

Decision  tree의 경우 만든 tree를 그림화 시킬수가 있습니다.

 

리눅스 기준으로 리눅스에  graphviz가 설치가 되어있어야 합니다. 없으면 sudo apt install graphviz 진행

tree.export_graphviz(df_model1,out_file='model1.dot',rounded=True,filled=True,special_characters=True,class_names=['2','4'])
tree.export_graphviz(df_model2,out_file='model2.dot',rounded=True,filled=True,special_characters=True,class_names=['2','4'])
os.system('dot -Tpng ./model1.dot -o model1.png')
os.system('dot -Tpng ./model2.dot -o model2.png')

entropy이용
gini이용

 

검정하기

 

모델 검정은 이전과 동일하게 진행합니다.

train_prediction1=df_model1.predict(X_train)
train_prediction2=df_model2.predict(X_train)
test_prediction1=df_model1.predict(X_test)
test_prediction2=df_model2.predict(X_test)

train_accuracy1=accuracy_score(train_prediction1,y_train)
train_accuracy2=accuracy_score(train_prediction2,y_train)
test_accuracy1=accuracy_score(test_prediction1,y_test)
test_accuracy2=accuracy_score(test_prediction2,y_test)

print(f'Mean accuracy score (entropy) : {train_accuracy1:.3}')
print(f'Mean accuracy score (gini) : {train_accuracy2:.3}')
print(f'Mean accuracy score (entropy) : {test_accuracy1:.3}')
print(f'Mean accuracy score (gini) : {test_accuracy2:.3}')
>>> print(f'Mean accuracy score (entropy) : {train_accuracy1:.3}')
Mean accuracy score (entropy) : 1.0
>>> print(f'Mean accuracy score (gini) : {train_accuracy2:.3}')
Mean accuracy score (gini) : 1.0
>>> print(f'Mean accuracy score (entropy) : {test_accuracy1:.3}')
Mean accuracy score (entropy) : 0.943
>>> print(f'Mean accuracy score (gini) : {test_accuracy2:.3}')
Mean accuracy score (gini) : 0.937
>>> 

 

검정 결과 그림으로 만들기

cm=pd.DataFrame(confusion_matrix(y_test,test_prediction1),columns=['2','4'],index=['2','4'])
sns.heatmap(cm,annot=True)
plt.show()

cm=pd.DataFrame(confusion_matrix(y_test,test_prediction2),columns=['2','4'],index=['2','4'])
sns.heatmap(cm,annot=True)
plt.show()

entropy 이용
gini 이용

 

여기까지 Decision tree에 대해서 분석을 해보았습니다.

 

현재까지 분석한 방법에 대한 정리를 해보았습니다.

Not-k fold result train set test set
SVM 0.9427 0.9428
Random forest 1 0.97
Logistic regression 0.973  0.96
KNN (K-Nearest neighbors) 0.979 0.96
Decision Tree (entropy) 1 0.943
Decision Tree (gini) 1 0.937

 


 지금 지속적으로 Classification에 대한 methods를 모으고 기본적으로 어떻게 돌리는 지에 대해서만 찾아서 돌리고 있습니다.

 

추후에는 각 모델별로 최적화를 위한 방법들에 대해서 더 자세히 다루도록하겠습니다.

 

그리고 regression에 대한 methods들에 대해서 모으고, 최적화 방법 다루고를 진행을 하고

 

그리고 나서 공공데이터를 이용하여 각 모델별 특징에 따른 정확성들을 분석하는 포스팅을 진행하고자 합니다.

 

감사합니다.

댓글