자료를 공개한 저자 오렐리앙 제롱에게 깊은 감사를 드립니다. 이와 더불어 한빛미디어로부터 강의준비에 필요한 자료를 지원받았음을 밝히며, 이에 대해 진심어린 감사를 전합니다.
붓꽃 데이터를 이용하여 사이킷런의 의사결정나무 모델을 학습시키고 학습결과 시각화 하기
붗꼿을 꽃잎의 길이와 너비 기준으로 분류하는 학습
사이킷런의 DecisionTreeClassifier
모델 활용
의사결정나무 방식의 최대 장점: 데이터 전처리 불필요
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
iris = load_iris()
X = iris.data[:, 2:] # 꽃잎 길이와 너비
y = iris.target
tree_clf = DecisionTreeClassifier(max_depth=2, random_state=42)
tree_clf.fit(X, y)
max_depth
: 의사결정나무의 최대 깊이 지정.export_graphviz()
함수 활용iris_tree.dot
파일에 저장gini
: 해당 마디의 불순도 측정값gini=0
.samples
: 해당 마디 결정에 사용된 샘플 수value
: 해당 마디 결정에 사용된 샘플을 클래스 별로 구분한 결과class
: 각 클래스별 비율을 계산하여 가장 높은 비율에 해당하는 클래스 선정
예를 들어, 깊이 2의 왼편 마디의 클래스별 비율은 아래와 같음
$$p_0= 0/54, \quad p_1=49/54, \quad p_2 = 5/54$$
꽃잎 길이: 2.45cm 초과
오른편으로 이동
꽃잎 너비: 1.75cm 이하
꽃잎 너비: 1.75cm 초과
max_depth=3
으로 지정할 경우를 보여줌.max_depth
값을 크게 잡으면 과대적합 위험도 커짐.예제: 꽃잎 길이와 너비가 각각 5cm, 1.5cm인 붓꽃에 대한 클래스 별 예측확률:
$$[ 0/54, 49/54, 5/54]$$
불순도: 마디에 포함된 gini
속성
$K$는 클래스 수이고, $p_k$는 클래스 $k$에 속한 샘플의 비율
$$G = 1 - \sum_{k=0}^{K-1} p_{k}^2$$
예를 들어, 깊이 2의 왼편 마디의 지니 불순도는 0.168
$$G = 1 - (0/54)^2 - (49/54)^2 - (5/54)^2 = 0.168$$
아래 비용함수를 최소화 하는 특성 $k$와 해당 특성의 임곗값 $t_k$을 결정
탐욕적 알고리즘(greedy algorithm) 활용
$$ J(k, t_k) = \frac{m_\text{left}}{m}\, G_\text{left} + \frac{m_\text{right}}{m}\, G_\text{right} $$
max_depth
깊이에 다다르거나 불순도를 줄이는 분할을 더 이상 찾을 수 없을 때, 또는 다른 규제의 한계에 다다를 때까지 반복DecisionTreeClassifier
의 presort=True
옵션 설정
훈련 세트가 크면 이 방식은 속도가 늦어짐
DecisionTreeClassifier
의 criterion="entropy"
옵션 설정: 특정 마디의 엔트로피($H$) 계산
$$H = -\sum_{\substack{k=0\\p_k\neq 0}}^{K-1} p_{k}\, \log(p_k)$$
DecisionTreeClassifier
규제하기¶max_depth
: 의사결정나무의 최대 높이 제한min_samples_split
: 마디를 분할하기 위해 필요한 최소 샘플 수min_samples_leaf
:나뭇잎에 포함되어야 하는 최소 샘플 수min_weight_fraction_leaf
: min_samples_leaf
와 동일한 역할 수행max_leaf_nodes
: 허용된 나뭇잎의 최대 개수max_features
: 각 마디에서 분할 평가에 사용될 수 있는 최대 특성 수min_
접두사 사용 규제: 값을 키울 것max_
접두사 사용 규제: 값을 감소시킬 것DecisionTreeClassifier
규제 사용¶moons
데이터셋에 대한 의사결정나무 모델 학습¶왼편: 규제 전혀 없음
오른편: min_samples_leaf=4
DecisionTreeClassifier
처럼 학습 과정에 사용되는 규제에 따라 분할을 제한하는 것DecisionTreeRegressor
예측기 활용¶max_depth=2
max_depth=3
samples
: 해당 마디에 속한 훈련 샘플 수value
: 해당 마디에 속한 훈련 샘플의 평균 타깃값mse
: 해당 마디에 속한 훈련 샘플의 평균제곱오차(mse)value
사용.아래 비용함수를 최소화 하는 특성 $k$와 해당 특성의 임곗값 $t_k$을 결정
각 마디의 평균제곱오차 $MSE$를 최소화하는 방향으로 학습
$$ J(k, t_k) = \frac{m_\text{left}}{m}\, \text{MSE}_\text{left} + \frac{m_\text{right}}{m}\, \text{MSE}_\text{right} $$
$\text{MSE}_\text{left}$($\text{MSE}_\text{right}$):
지정된 특성 $k$와 특성 임곗값 $t_k$로 구분된 왼편(오른편) 부분집합의 평균제곱오차(mse)
해당 마디에 속한 샘플들의 평균 타깃값 기준
$m_\text{node}$: 해당 마디에 속하는 샘플 수
$y^{(i)}$: 샘플 $i$에 대한 레이블
왼편: 규제가 없는 경우
오른편: min_samples_leaf=10