본문 바로가기

Machine Learning_모델설계_Python

의사결정나무_4 코드 실습

안녕하세요 배도리입니다. 요즘 제가 좋아하는 말이 있습니다. "설교 따윈 필요없다. 부러진 뼈가 더 큰 교훈을 세겨줄테니" 롤에서 일라오이라는 캐릭터를 선택하면 나오는 말입니다. 예전에는 아무 생각 없었는데 시간이 지나면서 참 와닿는 말입니다. 저보다 먼저 길을 걸었던 사람들이 저에 대해 조언이나 걱정을 해주면 그당시 저는 크데 와닿지 않았습니다. 그정도로 그런가? 굳이? 이런 생각을 했었는데 그 조언과 우려과 현실로 다가왔을때 뼈저리게 느끼더라구요. 이후에 저는 그 당시 들었던 조언이 몸과 정신에 체화되서 새로운 가치관이 형성됩니다. 부러지기전에 알았으면 좋았겠지만... 이랬던 경험이 한 두번이 아닙니다. 그런데 생각해보니 또 부러졌기에 지금 이 순간의 제가 있지 않겠습니까? 그럼 그냥 부러지겠습니다 ㅎㅎ. 각설하고 이번게시글에서는 그동안 배웠던 의사결정나무를 코드로 구현해보겠습니다.

 

역시 어김없이 등장한 iris 데이터!

#데이터 불러오기
 
import seaborn as sns #seaborn을 불러오고 네임스페이스를 sns로 축약
iris = sns.load_dataset('iris')  #iris라는 변수명으로 Iris 데이터셋 download

X = iris.drop('species', axis=1) #'species'열을 drop하고 input X를 정의
y_ = iris['species']

 

 

y 데이터를 범주형으로 변환하겠습니다.

 
from sklearn.preprocessing import LabelEncoder
classle = LabelEncoder() #class label
y = classle.fit_transform(iris['species'].values) #species 열의 문자열을 범주형으로 변환(0,1,2)
#fit()은 데이터에서 변환에 필요한 인코딩 매개변수를 학습하고, transform()은 이 매개변수를 사용하여 데이터를 실제로 변환
#
#인코딩 매개변수(encoding parameter)는 LabelEncoder가 범주형 변수를 숫자로 변환하는 데 필요한 정보

 

 

전체 데이터를 학습과 테스트 데이터 셋으로 분리합니다.

from sklearn.model_selection import train_test_split

#X(입력변수)와 y(종속변수)로 이루어진 데이터를 학습과 테스트 데이터넷으로 각각 70%, 30%의 비율로 나눔
X_train,X_test,y_train,y_test=train_test_split(X,y, test_size=0.3, random_state=1, stratify=y)

 

 

이제 분류나무를 적용해보겠습니다.

from sklearn.tree import DecisionTreeClassifier
#Scikit-learn 라이브러리에서 의사결정나무를 위한 함수인 DecisionTreeClassifier를 가져옵니다.
 
dtc = DecisionTreeClassifier(criterion='gini', max_depth=5, random_state=1)
#의사결정나무 분류기 객체를 생성합니다. 이 때, 결정나무의 불순도 측정 기준으로 'gini'를, 나무의 최대 깊이로 5를, 그리고 재현 가능성을 위한 random seed로 1을 설정합니다.
 
#과적합 사례 확인해보기: max_depth: 3, 5, 7로 증가시킨다면 확인가능
#dtc = DecisionTreeClassifier(criterion='entropy', max_depth=7, random_state=1)

dtc.fit(X_train, y_train)
y_train_pred = dtc.predict(X_train)  #Training accuracy
y_test_pred = dtc.predict(X_test)    #Test accuracy

 

 

정확도 확인 드갑니다.

from sklearn.metrics import accuracy_score
print(accuracy_score(y_train, y_train_pred))
print(accuracy_score(y_test, y_test_pred))
 
0.9904761904761905
0.9777777777777777

 

 

혼동행렬도 살펴보겠습니다.

from sklearn.metrics import confusion_matrix
print(confusion_matrix(y_test,y_test_pred))
[[15 0 0]
[ 0 15 0]
[ 0 1 14]]

 

 

시각화해서 살펴보겠습니다.

from sklearn.tree import plot_tree
import matplotlib.pyplot as plt
 
plt.figure(figsize=(25,15))
#그림(figure)과 축(axis)을 생성하고 그림의 크기를 설정합니다. 여기서 그림의 크기는 가로 25인치, 세로 12인치로 설정
features = iris.columns[:-1]
# iris 데이터 프레임의 모든 열 이름(즉, feature names)을 가져와 마지막 열을 제외한 나머지를 'features'에 저장

classes = ['setosa','versicolor','virginica']
#: iris 데이터의 클래스 이름을 'classes' 리스트에 저장합니다.
plot_tree(dtc,feature_names=features,class_names=classes,filled=True,fontsize=15)
#학습된 의사결정나무 모델(dtc)를 시각화하고, 각 feature와 class의 이름을 라벨로 지정합니다. 'filled=True'는 각 노드의 색을 클래스에 따라 다르게 표현, 폰트 크기는 15로 설정
plt.show()