Decision Tree
결정 트리는 데이터에서 학습한 일련의 특성 질문을 통해 예측합니다. 분할 기준 선택, 가지치기를 통한 과적합 억제, 코드 예제를 다룹니다.
의사결정 트리는 입력 특성에 관해 "소득이 $50,000를 초과하는가?"와 같은 예/아니요 질문을 차례로 던지고, 루트에서 예측값이 담긴 리프까지 답을 따라가 예측하는 지도 학습 모델입니다. 분류 트리는 각 리프에서 클래스를 예측하고, 회귀 트리는 숫자를 예측합니다. 모든 예측은 읽기 쉬운 규칙의 연쇄로 표현되므로 트리는 설명 가능한 AI(XAI)의 표준 도구이며, 랜덤 포레스트와 그래디언트 부스팅 앙상블의 구성 요소입니다. 이러한 앙상블은 중간 규모 표 형식 데이터 세트에서 여전히 딥러닝보다 우수한 성능을 보입니다. Breiman, Friedman, Olshen, Stone의 CART 알고리즘(1984)과 Ross Quinlan의 ID3(1986) 및 C4.5(1993)는 데이터에서 트리를 학습하는 방법을 확립했습니다.
의사결정 트리의 구축 방식#
트리는 재귀적 분할을 통해 위에서 아래로 성장합니다. 각 노드에서 알고리즘은 후보 분할의 점수를 계산합니다. 각 후보는 특성과 수치형 특성의 임계값으로 이루어지며, 두 자식 노드를 가장 동질적으로 만드는 분할을 선택한 뒤 각 자식 노드에서 탐색을 반복합니다. 분류 트리는 지니 불순도, 즉 해당 노드의 클래스 비율에 따라 라벨을 무작위로 배정할 때 노드에서 임의의 샘플이 잘못 분류될 확률이나 엔트로피로 동질성을 측정합니다. 엔트로피 감소량은 정보 이득이라고 합니다. 회귀 트리는 제곱 오차를 가장 크게 줄이는 분할을 선택하며, 각 리프는 학습 샘플의 타깃 평균을 예측합니다. 노드가 순수하거나 샘플 수가 너무 적거나 최대 깊이에 도달하면 성장을 멈춥니다. 각 분할은 다음 한 단계만 살펴보므로 이 탐욕적 탐색은 양호한 트리를 빠르게 구축하지만, 최적으로 증명된 트리를 찾는 문제는 NP-hard입니다.
scikit-learn의 DecisionTreeClassifier는 최적화된 CART 버전을 구현합니다. 이 예제는 아이리스 꽃 데이터 세트에서 깊이 2인 트리를 성장시키고 학습한 규칙을 출력합니다.
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier, export_text
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=42)
# A depth limit keeps the tree small enough to read and less prone to overfitting
clf = DecisionTreeClassifier(max_depth=2, random_state=42)
clf.fit(X_train, y_train)
print(export_text(clf, feature_names=iris.feature_names))
print(f"Test accuracy: {clf.score(X_test, y_test):.2f}")이 트리는 꽃잎 길이만 사용합니다. 길이가 2.45cm 이하인 꽃은 setosa(클래스 0)로 분류하고, 두 번째 임계값인 4.75cm로 versicolor(클래스 1)와 virginica(클래스 2)를 구분합니다. 이 규칙은 검증용으로 분리한 꽃의 97%를 정확히 분류합니다.
모든 분할은 이러한 형태의 임계값 규칙이며, 트리가 데이터에서 학습하거나 사람이 직접 설정할 수 있습니다. Ultralytics AIGym 운동 모니터는 YOLO26 포즈 추정 출력을 대상으로 이러한 규칙 두 개를 직접 설정합니다. 어깨, 팔꿈치, 손목 키포인트로 계산한 팔꿈치 각도가 145°를 넘으면 프레임에 "위"를 표시하고, 90° 미만으로 떨어지면 "아래"를 표시하며, 위에서 아래로 바뀔 때마다 횟수를 셉니다.
과적합과 가지치기#
모든 리프가 순수해질 때까지 성장한 트리는 잡음까지 포함해 학습 데이터를 암기하는데, 이는 과적합의 전형적인 사례입니다. 사전 가지치기는 최대 깊이나 리프당 최소 샘플 수와 같은 제한을 두어 성장을 일찍 멈춥니다. 사후 가지치기는 전체 트리를 성장시킨 다음 기여도가 낮은 가지를 제거합니다. scikit-learn은 ccp_alpha 매개변수를 통해 최소 비용 복잡도 가지치기를 구현하며, 값이 클수록 더 많이 가지치기합니다. 두 종류의 제한 모두 교차 검증으로 선택하는 하이퍼파라미터입니다.
가지치기를 한 트리도 분산이 큽니다. 학습 데이터가 조금만 달라져도 최상위 분할이 바뀌고 그에 따라 아래의 모든 분할이 달라질 수 있습니다. 앙상블은 여러 트리를 결합해 이 문제를 해결합니다. 랜덤 포레스트처럼 부트스트랩 샘플로 학습한 트리를 평균하거나, 그래디언트 부스팅처럼 이전 트리의 오류를 수정하도록 트리를 하나씩 추가합니다.
장점과 한계#
트리는 수치형 특성과 범주형 특성을 함께 처리하고, 특성 스케일링이 필요 없으며, 수작업 특성 엔지니어링 없이 상호작용과 비선형 효과를 포착하고, 몇 차례 비교만으로 예측합니다. 트리의 분할은 축 정렬 방식이므로 "지출이 소득을 초과한다"와 같은 대각선 경계는 비율 특성을 추가하지 않으면 여러 분할로 이루어진 계단형 경계가 됩니다. 회귀 트리는 각 리프에서 상수값을 예측하므로 선형 회귀와 달리 학습 데이터 범위를 벗어난 추세를 외삽할 수 없습니다.
응용 분야#
- 신용 결정: 대출 기관은 얕은 트리와 트리 기반 스코어카드를 사용해 신청자의 위험도에 따라 분류하며, 각 결정의 근거는 소득, 신용 이력, 부채 임계값으로 추적할 수 있습니다.
- 임상 중증도 분류: 트리 형태의 임상 의사결정 규칙은 활력 징후와 증상에 따라 환자를 분류합니다. 예를 들어 환자에게 즉각적인 영상 검사가 필요한지 판단할 수 있습니다.
- 고객 이탈: 트리는 사용량, 이용 기간, 지원 이력에 따라 고객을 이탈 위험이 높은 그룹과 낮은 그룹으로 나누며, 각 경로는 그룹의 특성을 평이한 용어로 설명합니다.
- 예측 유지보수: 진동, 온도, 가동 시간 특성을 사용하는 그래디언트 부스팅 트리는 다음 정비 전에 고장 날 가능성이 높은 기계를 예측합니다.
의사결정 트리와 관련 용어 비교#
- 랜덤 포레스트: 부트스트랩 샘플과 무작위 특성 부분집합으로 학습한 여러 트리의 평균을 구합니다. 단일 트리의 가독성을 낮추는 대신 정확도와 안정성을 높입니다.
- XGBoost, LightGBM, CatBoost: 이전 트리의 오류를 수정하도록 트리를 하나씩 추가하는 그래디언트 부스팅 라이브러리입니다. LightGBM은 대규모 데이터 세트의 속도를, CatBoost는 기본 범주형 특성 처리를 고려해 설계되었습니다.
- 딥러닝: 신경망은 원시 이미지, 오디오, 텍스트에서 특성을 학습하는 반면, 트리는 이미 테이블 열로 존재하는 특성을 기준으로 분할합니다.
- 의사결정 분석 트리: 운영 연구와 비즈니스 계획에서 의사결정 트리는 분석가가 손으로 그리는 다이어그램을 뜻하기도 합니다. 의사결정 노드, 우연 노드, 보상을 사용해 기대값을 기준으로 선택지를 비교하며, 학습 데이터에서 학습하는 대신 추정 확률을 바탕으로 구축합니다.










