[머신러닝 기초] 지도학습 - classification (decision tree)
지난 시간 복습
분류와 회귀 비교
분류알고리즘 다양하다.
- 나이브 베이즈
- 로지스틱 회귀
- 의사결정 나무
- 서포트 벡터 머신
- 최소 근접 알고리즘
- 신경망
- 앙상블
등이 있다.
이번 장에서는 decision tree, 의사결정 나무에 대해서 알아보겠다.
ㅁ Decision Tree (의사결정나무)
decision tree는 스무고개 게임과 유사하며 룰 기반의 프로그램에 적용되는 if-else 를 자동으로 찾아내 예측을 위한 규칙이라고 이해하면 어렵지 않을 것이다.
가능한한 적은 결정 노드로 높은 예측 정확도를 가지려면 데이터를 분류할때 최대한 많은 데이터 세트가 해당 분류에 속할 수 있도록 결정노드의 규칙이 정해져야 합니다.
1) 정보이득 (Gain Information)
- 정보이득 지수 = 1-엔트로피 지수
- 정보이득이 높은 속성을 기준으로 분할
** 엔트로피란? 데이터 집합의 혼잡도. 서로 다른 값이 섞여 있으면 엔트로피가 높고, 같은 값이 섞여 있으면 엔트로피가 낮음
2) 지니계수 (Gini index)
- 불평등 지수를 나타내는 계수
- 0일때 가장 평등하고, 1로 갈수록 불평등
- 지니 계수가 낮은 속성을 기준으로 분할
- 사이킷런에서 사용하는 DecisionTreeClassifier는 기본으로 지니계수를 이용하여 분할. 즉, 지니계수가 낮은 조건을 찾아서 자식 트리 노드를 반복적으로 분할한뒤, 데이터가 모두 특정 분류에 속하게 되면 분할을 멈추고 분류를 걸정함
ㅁ 용어
ㅁ 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