0Pricing
Learn AI with Python · 강의

결정 트리: 이론과 구현

지니 불순도, 정보 이득, 트리 깊이, 과적합, sklearn DecisionTreeClassifier를 다룹니다.

결정 트리: 이론과 구현은(는) CoddyKit의 무료 Learn AI with Python 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Learn AI with Python 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Learn AI with Python 강의에는 총 4개의 강의가 포함되어 있습니다.

결정 트리란 무엇인가

결정 트리는 특성 값을 기준으로 데이터를 여러 가지로 나누고, 리프 노드에서 예측에 도달할 때까지 예/아니요 질문을 반복합니다.

각 내부 노드는 하나의 특성을 검사하고, 각 가지는 결과를 나타내며, 각 리프는 클래스를 할당합니다. 결정 과정을 따라갈 수 있기 때문에 트리는 해석하기 쉽습니다.

지니 불순도

지니 불순도는 노드 안의 클래스가 얼마나 섞여 있는지를 측정합니다. 순수한 노드(모두 하나의 클래스)는 지니 불순도가 0입니다.

공식은 Gini = 1 - sum(p_i^2)이며, 여기서 p_i는 클래스 i의 비율입니다. 트리는 불순도를 가장 크게 줄이는 분할을 선택합니다.

import numpy as np

def gini(labels):
    classes, counts = np.unique(labels, return_counts=True)
    probs = counts / counts.sum()
    return 1 - np.sum(probs ** 2)

print(gini([0, 0, 1, 1]))   # 0.5 (max mix)
print(gini([0, 0, 0, 0]))   # 0.0 (pure)

정보 이득과 entropy

또 다른 분할 기준은 entropy를 바탕으로 하는 정보 이득입니다. 엔트로피는 -sum(p_i * log2(p_i))입니다.

정보 이득 = 엔트로피(부모) - 가중 엔트로피(자식)입니다. gini와 entropy는 대체로 비슷한 트리를 만들며, gini를 계산하는 편이 약간 더 빠릅니다.

import numpy as np

def entropy(labels):
    _, counts = np.unique(labels, return_counts=True)
    p = counts / counts.sum()
    return -np.sum(p * np.log2(p))

print(entropy([0, 0, 1, 1]))   # 1.0
print(entropy([0, 0, 0, 1]))   # ~0.81

DecisionTreeClassifier 학습

사이킷런은 DecisionTreeClassifier를 제공합니다. criterion 매개변수로 분할 기준을 선택합니다(gini 또는 entropy).

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

X, y = load_iris(return_X_y=True)
Xtr, Xte, ytr, yte = train_test_split(X, y, random_state=0)

clf = DecisionTreeClassifier(criterion="gini", random_state=0)
clf.fit(Xtr, ytr)
print("Accuracy:", clf.score(Xte, yte))

과적합과 max_depth

제약이 없는 트리는 모든 리프가 순수해질 때까지 자라며 잡음을 암기합니다. 이렇게 되면 과적합이 발생합니다.

max_depth 매개변수는 트리가 자랄 수 있는 깊이를 제한해 일반화하도록 합니다. 깊이가 작을수록 모델이 단순해지고 과적합도 줄어듭니다.

from sklearn.tree import DecisionTreeClassifier

shallow = DecisionTreeClassifier(max_depth=3, random_state=0)
deep = DecisionTreeClassifier(max_depth=None, random_state=0)
# shallow generalizes better on unseen data;
# deep often overfits the training set

기타 사전 가지치기 매개변수

max_depth 외에도 다음 매개변수로 성장을 제어할 수 있습니다.

  • min_samples_split 노드를 분할하는 데 필요한 최소 표본 수
  • min_samples_leaf 리프에 필요한 최소 표본 수
  • max_leaf_nodes 전체 리프 수의 상한

이 매개변수들은 모두 분산을 줄이고 과적합에 대응합니다.

from sklearn.tree import DecisionTreeClassifier

clf = DecisionTreeClassifier(
    max_depth=5,
    min_samples_split=10,
    min_samples_leaf=5,
    random_state=0,
)

plot_tree로 시각화하기

plot_tree는 전체 트리를 그려 모든 분할, 지니 값, 각 노드의 클래스 분포를 확인할 수 있게 합니다.

import matplotlib.pyplot as plt
from sklearn.tree import plot_tree
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris

X, y = load_iris(return_X_y=True)
clf = DecisionTreeClassifier(max_depth=3).fit(X, y)

plt.figure(figsize=(12, 6))
plot_tree(clf, filled=True, feature_names=load_iris().feature_names)
plt.show()

특성 중요도

학습이 끝나면 feature_importances_에서 모든 분할에 걸쳐 각 특성이 불순도를 얼마나 줄였는지 확인할 수 있습니다. 값의 합은 1.0입니다.

이는 어떤 입력이 모델에 가장 중요한지 빠르게 순위를 매기는 방법입니다.

from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris

data = load_iris()
clf = DecisionTreeClassifier(max_depth=3).fit(data.data, data.target)

for name, imp in zip(data.feature_names, clf.feature_importances_):
    print(f"{name}: {imp:.3f}")

비용-복잡도 가지치기 (ccp_alpha)

사후 가지치기는 완전히 자란 트리에서 약한 가지를 잘라 냅니다. ccp_alpha 매개변수는 가지치기 강도를 제어하며, 알파가 높을수록 더 많은 노드가 제거됩니다.

후보 알파 값을 찾으려면 cost_complexity_pruning_path를 사용하세요.

from sklearn.tree import DecisionTreeClassifier

base = DecisionTreeClassifier(random_state=0)
path = base.cost_complexity_pruning_path(Xtr, ytr)
alphas = path.ccp_alphas

pruned = DecisionTreeClassifier(ccp_alpha=0.01, random_state=0)
pruned.fit(Xtr, ytr)

최적의 Alpha 선택

ccp_alpha를 선택하려면 후보 알파 값마다 트리 하나를 학습시키고 검증 정확도를 비교하세요. 최적의 알파 값은 정확도와 단순성 사이에서 균형을 이룹니다.

from sklearn.tree import DecisionTreeClassifier

scores = []
for a in alphas:
    t = DecisionTreeClassifier(ccp_alpha=a, random_state=0)
    t.fit(Xtr, ytr)
    scores.append((a, t.score(Xte, yte)))

best = max(scores, key=lambda s: s[1])
print("Best alpha:", best[0])

장점과 단점

장점: 해석하기 쉽고, 스케일 조정이 필요 없으며, 비선형 경계를 처리하고, 여러 데이터 형식을 다룰 수 있습니다.

단점: 분산이 높고(데이터가 조금만 바뀌어도 트리가 달라짐), 과적합하기 쉬우며, 축에 평행한 분할만 사용할 수 있습니다. 이러한 단점 때문에 랜덤 포레스트와 같은 앙상블을 사용합니다.

빠른 확인

결정 트리 개념에 대한 이해도를 확인해 보세요.

복습

복습: 결정 트리는 지니 불순도 또는 정보 이득을 사용해 데이터를 분할합니다. 사전 가지치기(max_depth, min_samples_leaf) 또는 사후 가지치기(ccp_alpha)로 과적합을 제어하세요. plot_tree와 feature_importances_로 모델을 살펴보세요. 높은 분산 때문에 앙상블 방법을 사용하게 됩니다.

자주 묻는 질문

“결정 트리: 이론과 구현” 강의는 무료인가요?

네 — “결정 트리: 이론과 구현” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Learn AI with Python 강의 전체를 잠금 해제할 수 있습니다. Learn AI with Python 강의에는 총 4개의 강의가 포함되어 있습니다.

“결정 트리: 이론과 구현”에서 뭘 배우나요?

지니 불순도, 정보 이득, 트리 깊이, 과적합, sklearn DecisionTreeClassifier를 다룹니다. 브라우저에서 직접 실행하는 실습 코드로 Learn AI with Python을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Learn AI with Python을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Learn AI with Python은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“결정 트리: 이론과 구현” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Learn AI with Python 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Learn AI with Python 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 결정 트리: 이론과 구현
  2. 랜덤 forest와 배깅
  3. 그래디언트 부스팅: GBM과 XGBoost
  4. LightGBM과 CatBoost
← Learn AI with Python(으)로 돌아가기