데이터 분석/왕초보를 위한 머신러닝

[머신러닝 기초] 지도학습 - classification (decision tree)

ai-creator 2021. 10. 16. 10:12
반응형

지난 시간 복습

 

 

분류와 회귀 비교

분류알고리즘 다양하다. 

  • 나이브 베이즈
  • 로지스틱 회귀
  • 의사결정 나무
  • 서포트 벡터 머신
  • 최소 근접 알고리즘
  • 신경망
  • 앙상블

등이 있다.

 

이번 장에서는 decision tree, 의사결정 나무에 대해서 알아보겠다.

 

ㅁ Decision Tree (의사결정나무)

decision tree는 스무고개 게임과 유사하며 룰 기반의 프로그램에 적용되는 if-else 를 자동으로 찾아내 예측을 위한 규칙이라고 이해하면 어렵지 않을 것이다.

출처 : https://brunch.co.kr/@kakao-it/157

가능한한 적은 결정 노드높은 예측 정확도를 가지려면 데이터를 분류할때 최대한 많은 데이터 세트가 해당 분류에 속할 수 있도록 결정노드의 규칙이 정해져야 합니다.

 

1) 정보이득 (Gain Information)

- 정보이득 지수 = 1-엔트로피 지수

- 정보이득이 높은 속성을 기준으로 분할

** 엔트로피란? 데이터 집합의 혼잡도. 서로 다른 값이 섞여 있으면 엔트로피가 높고, 같은 값이 섞여 있으면 엔트로피가 낮음

2) 지니계수 (Gini index)

- 불평등 지수를 나타내는 계수

- 0일때 가장 평등하고, 1로 갈수록 불평등

- 지니 계수가 낮은 속성을 기준으로 분할

- 사이킷런에서 사용하는 DecisionTreeClassifier는 기본으로 지니계수를 이용하여 분할. 즉, 지니계수가 낮은 조건을 찾아서 자식 트리 노드를 반복적으로 분할한뒤, 데이터가 모두 특정 분류에 속하게 되면 분할을 멈추고 분류를 걸정함

https://m.blog.naver.com/2011topcit/220611261399

ㅁ 용어

ㅁ Decision Tree (의사결정나무) 시각화 해석

** Decision Tree는 이와 같이 해석이 가능하여 white box알고리즘이라고 칭한다. blackbox인 알고리즘이 대부분이므로, white box라는것은 큰 장점이다. 비지니스에 따라  다른 알고리즘에 비해 정확도가 다소 떨어지더라도 Decision Tree를 사용하는 경우가 있다.

ㅁ Sklearn API

1) DecisionTreeClassifier

Sklearn API

이를 위해 sklearn에서는 API를 지원한다.

목적 import API
Decision Tree from sklearn.tree import DecisionTreeClassifier DecisionTreeClassifier()

주로 사용하는 parameter는 다음과 같다.

** 파라메터는 Tree의 복잡도 결정을 세팅하는게 주 목적으로 보인다. 즉, Decision Tree의 과적합을 막기 위한 용도로 보인다.

파라메터 설명
min_samples_split - 노드를 분할하기 위한 최소한의 샘플 데이터 수
- default : 2
min_samples_leaf - 말단 노드가 되기 위한 최소한의 데이터 수
max_depth - 트리의 최대 깊이
max_leaf_nodes - 말단 노드의 최대 개수

코드에서 보면, 

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score

# 데이터 로드
iris_data = load_iris()

# 데이터 분리
X_train , X_test , y_train , y_test = train_test_split(iris_data.data, iris_data.target,
                                                       test_size=0.2,  random_state=11)
                                                       
# 알고리즘 object 생성
dt_clf = DecisionTreeClassifier(random_state=156)
## 파라메터 설정
# dt_clf = DecisionTreeClassifier(min_samples_split=4 ,random_state=156)

# 학습
dt_clf.fit(X_train , y_train)

# 예측
pred = dt_clf.predict(X_test)

# 평가
print("정확도:", accuracy_score(y_test, pred))

2) Graphviz 시각화

from sklearn.tree import export_graphviz

# export_graphviz()의 호출 결과로 out_file로 지정된 tree.dot 파일을 생성함. 
export_graphviz(dt_clf, out_file="tree.dot", class_names=iris_data.target_names , \
                feature_names = iris_data.feature_names, impurity=True, filled=True)
                
import graphviz

# 위에서 생성된 tree.dot 파일을 Graphviz 읽어서 Jupyter Notebook상에서 시각화 
with open("tree.dot") as f:
    dot_graph = f.read()
graphviz.Source(dot_graph)

<결과>

3) Feautre importance 시각화

  •  feature_importances_ 속성으로 시각화
  •  Decision Tree의 장점으로 중요피쳐를 볼 수 있다. 
  • 중요피처를 볼 수 있다는 것은, feature selection을 할 수 있는 기준이 되기도 한다. 처음 input data의 feature를 설정할 때는 어떤 feature가 중요한지 잘 모르는 경우가 많으므로, feature를 모두 넣고 점차적으로 줄여 알고리즘 학습 속도와 정확도를 높이는데 사용한다.
import seaborn as sns
%matplotlib inline

# feature importance를 column 별로 시각화 하기 
sns.barplot(x=dt_clf.feature_importances_ , y=iris_data.feature_names)

<결과>

ㅁ Reference

- [책] 파이썬 머신러닝 완벽가이드

- [블로그] 파이썬 머신러닝 완벽가이드 정리본 (Link)

- [소스코드 출처] https://github.com/wikibook/pymldg-rev

반응형