▶ Jupyter notebook 과 Google Colab에서 Graphviz 사용하기. (설치 및 사용법)
velog.io/@gggggeun1/%EA%B2%B0%EC%A0%95%ED%8A%B8%EB%A6%AC-%EA%B7%B8%EB%9E%98%ED%94%84-exportgraphviz
1. 결정 트리 그래프에 대한 설명
더 이상 자식 노드가 없는 노드는 레이블 값이 결정되는 Leaf node 입니다.
리프 노드가 되려면 오직 하나의 클래스 값으로 최종 데이터가 구성되거나 리프 노드가 될 수 있는 하이퍼 파라미터 조건을 충족하면 됩니다.
자식노드가 있는 노드는 Branch node이며 자식노드를 만들기 위한 분할 규칙 조건을 가지고 있습니다.
1번 Node | 의미 | 설명 |
petal width(cm) <=0.8 | 이처럼 조건이 있는 것은 자식 노드를 만들기 위한 규칙 조건 이 조건이 없으면 leaf node |
petal width(cm) 가 0.8 이하인 규칙으로 자식 노드 생성 |
samples = 120 | 현 규칙에 해당하는 총 데이터 건수 | 전체 데이터가 120개라는 의미 |
value = [ 40, 37, 43 ] | 클래스 값 기반의 각 데이터 건수 | 붓꽃 데이터의 클래스 값으로 0,1,2 를 가지고 있으며, 0(Setosa)에 40개 1(Versicolor)에 37개 2(Virginica)에 43개를 가지고 있다는 뜻 |
classs = Virginica | 가장 많은 데이터 건수의 클래스 값 | Virginica(class 2)의 개수(43개)가 가장 많다는 뜻 |
gini = 0.665 | value =[ ]로 주어진 데이터 분포에서의 지니 계수 | sample 120개가 value=[40,37,43] 분포도로 되어 있을 때 지니 계수는 0.665이다. |
<노드 설명>
- 1번 노드의 규칙이 True이면 2번 노드 False이면 3번 노드가 만들어집니다.
- 2번 노드는 petal width(cm) <= 0.8 인 규칙을 만족했을 때, 40개의 모든 데이터가 Setosa(0)로 결정되므로 클래스가 결정된 leaf node가 되고, 노드는 끝이 납니다. (지니계수 0)
- 3번 노드는 petal width(cm) <= 0.8 이 False인 규칙 노드이다. 80개 샘플 데이터 중 Vesicolor 37개, Virginica 43개로 여전히 지니 계수는 0.497로 높으므로 다음 자식 브랜치 노드로 분기할 규칙 필요함. (petal length <= 4.75로 규칙생성)
- 4번 노드는 3번 규칙 petal length <= 4.75가 True인 규칙 노드이다. 샘플데이터 34개 중 Vesicolor 33개, Virginica 1개로 대부분이 Versicolor이며 지니 노드가 0.057로 매우 낮지만 아직 섞여있으므로 한번 더 자식노드 생성
- 5번 노드는 규칙 petal length <= 4.75가 False인 규칙 노드이다. 46개 샘플데이터 중 Vesicolor 4개, Virginica 42개로 대부분이 Virginica 이지만, Vesicolor가 섞여 있으므로 다시 자식 노드 생성
- 각 노드의 색깔 = 레이블 값
- 색의 농도 = 짙을수록 지니 계수 낮고 해당 레이블에 속하는 샘플 데이터가 많다는 뜻
▶결론
4번 노드를 살펴보면 [33개:1개] 분포이지만 두 레이블을 구분하기 위해 또 다시 자식 노드를 생성한다. |
2. 결정트리의 하이퍼파라미터
하이퍼 파라미터 조정
min_samples_split | - 노드를 분할하기 위한 최소한의 샘플 데이터 수 - 과적합을 제어함 - defalt =2 - 작게 설정할수록 분할되는 노드가 많아져서 과적합 가능성 증가 |
min_samples_leaf | - 말단 노드(leaf)가 되기 위한 최소한의 샘플 데이터 수 - min_samples_split과 유사하게 과적합 제어 용도. - 비대칭적(imbalanced) 데이터의 경우 특정 클래스의 데이터가 극도로 작을 수 있으므로 이 경우는 작게 설정 필요. |
max_features | - 최적의 분할을 위해 고려할 최대 피처 개수 - defalt = None (모든 피쳐 사용) - int 형 = 대상 피처의 개수로 지정 - float 형 = 전체 피처 중 대상 피처의 퍼센트로 지정 - 'sqrt' = 전체 피처 개수의 루트값 선정 - 'auto' = squrt - 'log' = 전체 피처 중 log2 선정 - 'None' = 전체피처 선정 |
max_depth | - 트리의 최대 깊이를 규정 - defalt = None (완벽하게 클래스 결정 값이 될 때까지 계속 분할 or 노드가 가지는 데이터 개수가 min_samples_split보다 작아질 때까지 계속 깊이를 증가) |
max_leaf_nodes | - 말단 노드(Leaf)의 최대 개수 |
1. max_depth = 3
max_depth를 제한없음에서 3개로 설정하면 트리 깊이가 3인 간장한 결정 트리가 된다.
2. min_samples_splt = 4
자식 규칙 노드를 분할해 만들기 위한 최소한의 샘플 데이터 개수이다. 만약 샘플데이터 개수가 4보다 작으면 더 이상 자식 규칙 노드를 분할 하지 않고 leaf node가 된다.
빨간 네모박스의 node들은 지니계수가 남아있지만 sample 수가 4 보다 작아 더이상 분할되지 않았다.
3. min_samples_leaf = 4
leaf node가 될 수 있는 샘플데이터 개수의 최솟값을 지정한다.
리프 노드가 될 수 있는 조건은 defalt로 1인데, 이 의미는 다른 클래스 값이 하나도 없이 단독 클래스로만 되어 있거나 단 한개의 데이터로 되어 있을 경우에는 리프 노드가 될 수 있다는 뜻이다.
하지만 이 값을 키우면 더 이상 분할하지 않고, 리프 노드가 될 수 있는 조건이 완화되며, 그로인해 리프 노드를 만들기 위해 규칙 조건이 변하게 된다.
즉, 4로 설정한다는 말은 샘플이 4이하이면 무조건 리프 노드가 되기 때문에 지니 계수값 상관없이 샘플이 4인 조건으로 규칙 변경을 선호하게 되어 자연스럽게 브랜치가 줄어들고 결정트리가 더 간결해진다.
3. 피처 중요도
결정트리는 균일도에 기반해 어떠한 속성을 규칙 조건으로 선택하느냐가 중요한 요건이다.
중요한 몇 개의 피처가 명확한 규칙 트리를 만드는데 크게 기여하며, 모델을 좀 더 간결하고 이상치(Outlier)에 강한 모델을 만들 수 있기 때문이다.
사이킷런은 결정 트리 알고리즘이 학습을 통해 규칙을 정하는데 있어 피처의 중요한 역할 지표를 제공한다.
=> feature_importances
<code>
import seaborn as sns
import numpy as np
%matplotlib inline
# feature importance 추출
print("Feature importances : \n{0}".format(np.round(dt_clf.feature_importances_, 3)))
# feature importance 매핑
for name, value in zip(iris_data.feature_names, dt_clf.feature_importances_) :
print('{0} : {1:.3f}'.format(name, value))
# feature importance를 column 별로 시각화하기
sns.barplot(x=dt_clf.feature_importances_, y=iris_data.feature_names)
petal width (cm)가 가장 피처 중요도가 높음을 알 수 있다.
▶ 결론
일반적으로 다른 알고리즘은 내부의 동작 원리가 복잡해 '블랙박스'인 반면, 결정 트리는 알고리즘 자체가 직관적이기 때문에 알고리즘과 관련된 요소를 시각적으로 표현할 수 있는 다양한 방안이 있다.
규칙트리의 시각화와 피쳐중요도 속성으로 결정 트리 알고리즘이 어떻게 동작하는지 직관적으로 이해할 수 있다. |
'머신러닝 (Machine Learning) > 분류(Classification) 분석' 카테고리의 다른 글
분류 관련 Youtube (0) | 2021.02.14 |
---|---|
결정 트리의 과적합 (Overfitting) 시각화로 이해하기 (0) | 2021.02.14 |
결정 트리 (Decision Tree) (0) | 2021.02.13 |
분류의 평가(Evaluation) (2) F1 score , ROC AUC (0) | 2021.02.13 |
분류의 평가(Evaluation) (1) Confusion Matrix, Accuracy, Precision, Recall (0) | 2021.02.11 |