들어가며
결정 트리는 분류, 회귀, 다중 출력 작업까지 모두 가능한 다목적 머신러닝 모델이다
데이터 구조가 매우 복잡한 데이터셋도 학습할 수 있으며
최근 자주 사용되는 랜덤 포레스트 모델의 기본 구성 요소로도 쓰이는 유용한 알고리즘이다
이번 글에서는 이 결정트리가 어떤 식으로 예측을 하는 지 구조와 함께
어떤 방식으로 훈련을 하는 지 알아볼 것이다
결정 트리
결정 트리가 어떤 식으로 동작 하는지 파악하기 위해서는
우선 결정트리를 시각화 시켜서 보는 것이 편하다
from sklearn.tree import DecisionTreeClassifier
iris = load_iris(as_frame=True)
X_iris = iris.data[["petal length (cm)", "petal width (cm)"]].values
y_iris = iris.target
tree_clf = DecisionTreeClassifier(max_depth=2, random_state=42)
tree_clf.fit(X_iris, y_iris)
우선 데이터를 학습시키고
from sklearn.tree import export_graphviz
export_graphviz(
tree_clf,
out_file=str(IMAGES_PATH / "iris_tree.dot"), # 경로가 책과 다릅니다.
feature_names=["petal length (cm)", "petal width (cm)"],
class_names=iris.target_names,
rounded=True,
filled=True
)
export_graphviz() 함수를 사용하여 훈련된 결정트리를 시각화할 수 있다

우선 이 모델은 꽃잎의 길이,너비 등을 기준으로 해서 붓꽃의 품종을 구분하는 모델이다
깊이가 0인 맨 위의 노드를 루트 노드라고 부르며 밑의 노드들을 자식 노드라고 부른다
깊이가 2인 맨 아래 위치한 노드 즉 자식노드를 가지지 않는 노드를 리프 노드라고 부르고
리프 노드에서 예측이 이루어진다고 보면 된다
루트 노드에서 꽃잎의 길이가 2.45보다 짧은지 검사가 이루어지며
만일 True라면 왼쪽 노드로 이동하고 False라면 오른쪽 노드로 이동한다
False로 이동한 것들 중 꽃잎의 너비가 1.75보다 작은지 검사가 이루어진다
리프 노드는 노드가 충분히 순수한 경우(대부분 같은 클래스) 즉 더 이상 불순도 감소가 거의 없을 때와
규제 파라미터로 인해 분할이 중단된 시점에서 생겨난다
위의 모델에서는 깊이가 1인 지점에서 True로 이동된 50개의 샘플들 중
50개가 모두 setosa 클래스이므로 더 이상 분할이 이루어지지 않고 setosa라고 예측한다
깊이가 2인 지점에서는 규제 파라미터로 인해 더 이상 분할이 이루어지지 않아서
리프 노드가 되며 꽃잎 너비가 1.75보다 작은 것은 versicolor라고 예측하고 큰 것은 virginica라고 예측한다
참고로 리프 노드가 아닌 노드들을 봐도 class가 판정되어있는 것을 볼 수 있는데
원래는 노드 안에서 가장 많은 비율을 가진 클래스로 나타내는데
그 비율이 동률일 경우 클래스 인덱스 순서나 내부 정렬 기준으로 하나를 선택하는 것이다
노드를 보면 samples라는 속성이 있는데
이 속성은 해당 노드에 얼마나 많은 샘플이 적용되었는 지를 나타낸다
150개의 훈련 샘플 중 50개는 2.45보다 짧고 100개는 길다
그 100개 중 54개는 꽃잎 너비가 1.75보다 작고 46개는 크다
value 속성은 각 클래스에 얼마나 많은 샘플이 있는 지를 알려준다
깊이가 2인 곳에서 오른쪽 노드를 보면 value = [0,1,45]인데
setosa가 0개 versicolor가 1개 virginica가 45개가 들어있고 보면된다
마지막으로 gini속성은 지니 불순도라는 수치를 나타낸다
지니 불순도는 한 노드 안에 서로 다른 클래스가 얼마나 섞여있는 지를 나타내는 수치다

p는 해당 노드에서 각 클래스의 비율을 의미한다
깊이가 2인 지점에서 왼쪽 노드의 지니 불순도를 계산해보면
1 - (0/54) - (49/54) - (5/54) = 약 0.168정도로 계산된다
깊이가 1인 지점의 왼쪽 노드의 지니불순도를 계산해보면 0이 나오는데
모든 샘플이 같은 클래스에 속해있고 이를 순수 노드라고도 부른다

위 훈련 모델을 그림으로 표현하면 위와 같다
굵은 수직선이 깊이 0 구간의 결정 경계 (꽃잎 길이 = 2.45)를 나타내고
가로의 파선은 깊이가 1인 구간의 결정 경계(꽃잎 너비 1.75)를 나타낸다
위 모델은 깊이를 2까지만 설정하였지만
만약 max_depth 매개변수를 3으로 설정하면 결정 경계가 추가로 생기게 된다
위 그림에서는 두 개의 수직 점선이 추가로 생긴 것을 확인할 수 있다
CART 훈련 알고리즘
사이킷런에서 결정 트리는 훈련을 시킬 때 CART 알고리즘을 사용한다
CART 알고리즘은 우선 훈련 세트를 두 개의 서브셋으로 나눌 특성 k와 임곗값 t를 구한다
위 모델에서는 특성 k는 꽃잎의 길이를 의미하고 임계값 t는 2.45라고 볼 수 있다
그렇다면 어떻게 특성 k와 임곗값 t를 구하는 걸까?
알고리즘이 CART 비용함수를 최소화하는 k,t 쌍을 찾아야한다

노드가 true, false로 나뉘므로 Nl,NR은 각각 왼쪽 오른쪽의 샘플 수를 의미한다
GiniL,GiniR은 왼쪽 오른쪽 노드의 지니 불순도를 의미한다
이 비용함수가 최소가 되는 쌍을 구했다면
같은 방식으로 한번 더 쌍을 구하고 서브셋을 나누고 이를 반복한다
위에서 말했듯이 이 분할은 규제 파라미터로 인해 최대 깊이가 되거나
불순도를 줄이는 분할을 더 이상 찾을 수 없을 때 종료된다
마치며
이번 글에서는 결정 트리의 예측이 이루어지는 구조와 훈련 방식에 대하여 알아보았다
True,False로 이루어진 구조라 시각적으로 보면 이해하기 쉬운 알고리즘에 속한다고 생각했다
그만큼 간단하면서 직관적인 알고리즘이라는 생각이 들었고
동시에 그럴수록 과대적합되기 쉽고 일반화가 어려워지는 등 한계점이 명확해지며
조심해서 써야하는 모델이라는 생각이 들었다
실제 현업에서는 결정 트리 단독으로 사용하는 일은 잘 없고
랜덤 포레스트나 부스팅같은 앙상블 모델의 구성 요소로 사용된다고 한다
결정 트리를 배우고 나니 랜덤 포레스트와 같은 앙상블 모델이 어떤 식으로 동작하는 지에 대한 궁금증이 생겼고
공부한 후 다음 글에서 소개하도록하겠다
'AI > Machine Learning' 카테고리의 다른 글
| [AI] 랜덤 패치, 랜덤 서브스페이스, 랜덤 포레스트 (0) | 2026.04.21 |
|---|---|
| [AI] 앙상블 알고리즘(투표 기반 분류기, 배깅과 페이스팅) (0) | 2026.04.19 |
| [AI] 비선형 서포트 벡터 머신(SVM) 분류 (0) | 2026.04.05 |
| [AI] 서포트 벡터 머신(SVM) 회귀 (0) | 2026.03.31 |
| [AI] 선형 서포트 벡터 머신(SVM) 분류 (0) | 2026.03.30 |
