Decision Tree는 분류 및 회귀 작업 모두에 사용되는 비모수 지도 학습 알고리즘으로 루트 노드, 가지, 내부 노드 및 리프 노드로 구성된 계층적 트리 구조를 가지고 있다.

장점
단점
결정트리는 가능한 모든 특성·임계값 후보를 시험해 불순도(정보) 감소가 최대인 분할을 고르고, 이를 재귀적으로 반복한다.
핵심은 “매 단계에서 가장 좋은 분할을 탐욕적(greedy) 으로 선택한다”는 것이다.
아래는 깊이가 각 1→2→9인 결정트리가 만든 결정 경계이다.

수식(분류, 지니 예시):
여기서 는 불순도, 은 왼쪽/오른쪽 샘플 수이다.
CART(Classification And Regression Tree) 알고리즘은 결정 트리를 학습시키는 대표적인 방법으로,
엔트로피
엔트로피는 데이터의 불확실성을 측정하는 지표로, 분류 문제에서 얼마나 혼합된 데이터를 가지고 있는지를 나타낸다. 엔트로피가 높을수록 데이터가 더 혼란스럽고, 엔트로피가 낮을수록 데이터가 더 잘 정돈된 상태다.
정보이득(Information Gain)
정보 이득은 데이터를 특정 속성(특징)에 따라 분할했을 때, 불확실성이 얼마나 줄어드는지를 측정하는 지표다. 높은 정보 이득을 가진 속성을 선택하면 데이터의 엔트로피를 크게 줄일 수 있다.
트리가 너무 깊어지는 것을 사전에 막아 과적합을 줄인다.
max_depth: 트리 최대 깊이 제한(가장 영향력 큼)min_samples_split: 분할을 시도할 최소 샘플 수min_samples_leaf: 잎이 가질 최소 샘플 수(작을수록 과적합↑)max_leaf_nodes: 잎 노드 수 상한max_features: 분할 후보로 볼 특성 개수 제한(랜덤화 → 분산↓, 과적합↓)class_weight: 불균형 시 노드 점수 계산에 가중치 반영min_impurity_decrease: 분할 시 필요한 최소 불순도 감소량
max_depth을 설정하지 않아 깊어진 트리, 출처: IT Story튜닝 원칙
max_depth 로 큰 과적합을 막고, 필요하면 min_samples_leaf 를 키워 노이즈 분할을 억제max_features 로 랜덤성을 주어 일반화를 개선성장 후 불필요한 가지를 잘라 단순화(사후 가지치기)한다.
ccp_alpha 가 이 계열의 규제 강도이다실무 절차
1) cost_complexity_pruning_path 로 알파 경로 후보를 얻음
2) 각 ccp_alpha 로 교차검증하여 최적 알파 선택
3) 최종 트리를 재학습
시각화에는 몇가지 방법이 있는데 우리 수업 시간엔 graphviz를 설치하여 진행했다. 아래 예시는 레드/화이트 와인 이진분류 데이터셋을 사용하여 분석/시각화한 결정트리이다.
dt_clf = DecisionTreeClassifier(random_state=0, max_depth=3)
dt_clf.fit(X_train, y_train)
dt_clf.score(X_train, y_train), dt_clf.score(X_test, y_test)
# (0.8433908045977011, 0.8584615384615385)
max_depth=3으로 사전 가지치기(pre-pruning) 를 적용해 과적합을 완화함from sklearn.tree import plot_tree
plt.figure(figsize=(20, 10))
plot_tree(
dt_clf,
filled=True, # 색 채우기 옵션 (특정 클래스의 비율 표현)
feature_names=X.columns, # 특성 이름
class_names=['red wine', 'white wine'], # 클래스 이름
# max_depth=3
)
plt.savefig('wine_simple.png') # 이미지 저장
plt.show()
filled=True: 색으로 클래스 비율을 표현(노드가 더 “순수”할수록 한 색으로 진해짐)feature_names, class_names: 노드 라벨을 사람이 읽기 좋게 표시
트리 노드 라벨의 각 항목 의미:
sugar <= t: 분할 기준(왼쪽 가지는 sugar ≤ t, 오른쪽은 > t)gini: 지니 불순도 1−∑kpk21-\sum_k p_k^21−∑kpk2 (0에 가까울수록 한 클래스가 지배적)samples: 해당 노드에 포함된 샘플 수value=[n_red, n_white]: 노드 내 클래스별 개수class: 그 노드에서 다수 클래스(예측 클래스)이 트리는 당도(sugar) 를 중심으로 레드/화이트를 나누며, max_depth=3으로 과적합을 억제해 테스트 정확도 ≈ 86%를 얻었다.
IT Story: https://itstory1592.tistory.com/13
텐서 플로우 블로그 (Tensor ≈ Blog): https://tensorflow.blog/
IBM: https://www.ibm.com