의사결정 트리(Decision Tree)는 랜덤 포레스트(Random Forest) 알고리즘의 기본 구성 요소입니다. 머신러닝에서 가장 널리 사용되는 알고리즘 중 하나로, 주로 분류(Classification) 작업에 활용됩니다. 직관적이고 이해하기 쉬운 구조 덕분에 많은 개발자와 데이터 과학자에게 사랑받고 있습니다.
의사결정 트리란 무엇인가?
의사결정 트리가 내린 결정은 특정 예측이 왜 그렇게 도출되었는지 설명할 수 있습니다. 즉, 처리 과정의 입력과 출력이 사용자에게 명확하게 드러나는 것입니다. 또한 의사결정 트리는 배깅(Bagging), 랜덤 포레스트, 그래디언트 부스팅(Gradient Boosting)과 같은 앙상블(Ensemble) 기법의 기반이 되는 알고리즘이기도 합니다.
의사결정 트리는 CART(Classification And Regression Trees), 즉 '분류 및 회귀 트리'라고도 불리며, 자료구조에서 배우는 이진 트리(Binary Tree) 형태로 시각화할 수 있습니다.
트리의 구조
트리의 모든 노드(Node)는 하나의 입력 변수를 나타내며, 말단 노드(Leaf Node, 터미널 노드)에는 출력 변수가 담깁니다. 이 말단 노드를 통해 최종 예측이 수행됩니다.
의사결정 트리를 생성할 때의 기본 아이디어는 주어진 데이터 공간을 여러 구역으로 나누는 것입니다. 모든 값을 고려하고 다양한 분할(Split)을 시도하여 비용은 최소화하면서 최상의 예측값을 얻습니다. 이때 값들은 탐욕적(Greedy) 방식으로 선택됩니다.
분할과 정보 획득
노드의 분할은 트리의 최대 깊이(Maximum Depth)에 도달할 때까지 계속됩니다. 의사결정 트리를 사용하는 핵심 목적은 특정 피처(feature) 값을 기준으로 입력 데이터셋을 더 작은 데이터셋으로 나누어, 모든 타겟 변수가 하나의 범주에 속할 때까지 반복하는 것입니다. 각 단계마다 최대한의 정보 획득량(Information Gain)을 얻도록 분할이 이루어집니다.
지니 계수(Gini Value)의 역할
모든 의사결정 트리는 뿌리(Root)에서 시작되며, 첫 번째 분할이 바로 이곳에서 일어납니다. 노드를 효율적으로 정의하기 위해서는 적절한 평가 기준이 필요합니다.
바로 이 지점에서 지니 값(Gini Value)이 등장합니다. 지니 계수는 불평등도(Inequality)를 측정하는 데 가장 널리 쓰이는 지표 중 하나로, 여기서 불평등도란 노드 내 각 하위 집합이 속할 수 있는 타겟 클래스(출력값)의 분포를 의미합니다.
따라서 매 분할이 일어날 때마다 지니 값이 계산되며, 이 지니 값을 기반으로 정보 획득량을 정의할 수 있습니다.
DecisionTreeClassifier 사용법
사이킷런(sklearn)의 DecisionTreeClassifier는 다중 클래스 분류(Multiclass Classification)를 수행하는 데 사용됩니다. 기본 문법은 다음과 같습니다.
class sklearn.tree.DecisionTreeClassifier(*, criterion='gini',…)
예제 코드
from sklearn import tree
from sklearn.model_selection import train_test_split
my_data = [[16,19],[17,32],[13,3],[14,5],[141,28],[13,34],[186,2],[126,25],[176,28],
[131,32],[166,6],[128,32],[79,110],[12,38],[19,91],[71,136],[116,25],[17,200], [15,25], [14,32],[13,35]]
target_vals =['Man','Woman','Man','Woman',
'Woman','Man','Woman','Woman',
'Woman','Woman','Woman','Man','Man',
'Man','Woman', 'Woman', 'Woman',
'Woman','Man','Woman','Woman']
data_feature_names = ['Feature_1','Feature_2']
X_train, X_test, y_train, y_test = train_test_split(my_data, target_vals, test_size = 0.2, random_state = 1)
clf = tree.DecisionTreeClassifier()
print("The decision tree classifier is being called")
DTclf = clf.fit(my_data,target_vals)
prediction = DTclf.predict([[135,29]])
print("The predicted value is ")
print(prediction)실행 결과
The decision tree classifier is being called The predicted value is ['Woman']
코드 설명
- 필요한 패키지들을 환경에 임포트합니다.
- 피처(feature) 값을 기반으로 타겟 값을 분류하는 코드입니다.
- 피처 벡터와 타겟 값을 정의합니다.
- 'train_test_split' 함수를 사용해 데이터를 학습용과 테스트용 세트로 분할합니다.
- DecisionTreeClassifier를 호출하고 데이터를 모델에 학습(fit)시킵니다.
- 'predict' 함수를 사용해 새로운 피처 값에 대한 예측을 수행합니다.
- 예측 결과가 콘솔에 출력됩니다.
위 예제에서 입력값 [135, 29]에 대한 예측 결과로 'Woman'이 출력된 것을 확인할 수 있습니다. 이처럼 의사결정 트리는 소량의 데이터로도 빠르게 학습하고 예측을 수행할 수 있는 강력한 분류 도구입니다.