본문 바로가기
AI/Machine-Learning

[sklearn] 결정트리

by Wikinist 2023. 8. 30.

엔트로피

클라우드 섀넌(Cloud Shannon)은 정보 이론의 선구자 중 하나로, 1948년에 "통신의 수학적 이론"이라는 논문에서 정보 이론의 기초를 제시했습니다. 이 논문에서 섀넌은 정보를 어떻게 정량화하고, 전달되는 정보의 양을 측정할 수 있는지에 대한 개념을 소개했습니다. 이러한 이론의 중요한 개념 중 하나가 "엔트로피"입니다.

엔트로피는 정보의 불확실성 또는 예측 불가능성을 나타내는 척도로 사용됩니다. 더 정확하게 말하면, 어떤 시스템이나 확률 분포에서 가능한 결과의 다양성을 측정하는 개념입니다. 엔트로피가 높을수록 가능한 결과들이 더 다양하며, 정보의 불확실성이 큽니다. 반대로, 엔트로피가 낮을수록 가능한 결과들이 제한적이며, 정보의 불확실성이 낮습니다.

정보 이론에서 엔트로피는 다음과 같은 수식으로 계산됩니다:

결정트리 수식

이 식은 모든 가능한 결과에 대한 확률의 로그를 취한 후, 그 값에 확률을 곱한 합을 음수로 취한 것입니다. 이렇게 함으로써 확률이 높은 결과에 의해 엔트로피 값이 줄어들게 됩니다.

엔트로피의 개념은 주로 통신 분야에서 정보의 압축, 보안, 채널 용량 등을 다룰 때 사용됩니다. 또한 엔트로피는 확률 분포의 특성을 분석하고 정보의 손실 또는 불확실성을 평가하는데 유용한 개념으로 널리 활용됩니다.

결정트리

결정 트리(Decision Tree)는 데이터 분류와 회귀 분석 문제를 해결하는 데에 널리 사용되는 지도 학습 알고리즘입니다. 이 알고리즘은 데이터의 특징을 기반으로 하여 의사 결정 규칙을 만들어내는 모델입니다. 결정 트리는 그래프 형태의 트리 구조를 가지며, 각 내부 노드(internal node)는 특정 특징(feature)을 나타내며, 각 리프 노드(leaf node)는 클래스 레이블(데이터 분류)이거나 예측 값(회귀 분석)을 나타냅니다.

결정 트리의 작동 원리는 다음과 같습니다:

분할 기준 선택: 데이터셋을 가장 잘 나눌 수 있는 특징과 그에 따른 분할 기준(경계)을 선택합니다. 이 때 데이터를 가장 잘 분류할 수 있는 특징을 찾는 것이 중요합니다. 분할 기준은 일반적으로 엔트로피나 지니 불순도와 같은 지표를 사용하여 결정됩니다.

데이터 분할: 선택한 특징과 분할 기준에 따라 데이터를 분할합니다. 이렇게 하면 데이터가 더 이상 분할할 수 없을 때까지 트리의 노드가 생성됩니다.

재귀적 분할: 각 내부 노드에서 위의 단계를 반복적으로 수행하여 트리의 깊이를 증가시킵니다. 이렇게 하면 모든 리프 노드가 생성됩니다.

가지치기 (Pruning): 생성된 트리는 과적합(overfitting)될 수 있습니다. 이를 방지하기 위해 가지치기를 수행하여 불필요한 분기를 제거하거나 병합할 수 있습니다.

결정 트리의 장점은 다음과 같습니다:

해석력: 생성된 결정 트리는 직관적으로 이해하기 쉽습니다. 각 분기와 결정 규칙은 실제로 어떻게 데이터가 분류되거나 예측되는지를 나타냅니다.
다양한 데이터 유형 지원: 범주형 데이터와 연속형 데이터 모두 처리할 수 있습니다.
특징 중요도 평가: 트리의 구조를 통해 어떤 특징이 분류나 회귀에 가장 중요한 역할을 하는지 평가할 수 있습니다.
하지만 결정 트리는 과적합되기 쉽고, 특정 데이터셋에 대해 민감할 수 있으며, 복잡한 문제에 대해서는 단일 트리로는 제한이 있을 수 있습니다. 이를 해결하기 위해 앙상블 기법인 랜덤 포레스트(Random Forest)나 그래디언트 부스팅(Gradient Boosting)과 같은 방법을 사용하여 여러 개의 결정 트리를 조합하는 경우가 많습니다.

결정트리에서 엔트로피의 역할

결정 트리에서 엔트로피는 데이터를 어떻게 분할해야 할지 결정하는데 중요한 역할을 합니다. 엔트로피는 데이터의 불순도나 혼잡도를 나타내는 지표로 사용되며, 결정 트리 알고리즘에서 노드를 분할할 때 어떤 특징을 선택할지 도움을 줍니다.

결정 트리의 노드 분할은 불순도를 최소화하거나 정보 획득(information gain)을 최대화하는 방향으로 이루어집니다. 엔트로피는 이 정보 획득을 계산하는데 사용되는 척도 중 하나입니다.

엔트로피가 높을수록 데이터의 혼잡도가 커지며, 엔트로피가 낮을수록 데이터가 순수해지고 분류가 더 잘 이루어진다고 볼 수 있습니다.

분할 후의 엔트로피를 계산하여 이전 엔트로피에서 차감한 값이 정보 획득입니다. 즉, 분할 전과 분할 후의 엔트로피 차이를 통해 얼마나 데이터가 더 순수하게 분류되는지를 측정합니다. 정보 획득이 클수록 분할이 좋다고 판단됩니다.

정리하면, 결정 트리에서 엔트로피는 노드 분할의 기준으로 활용되며, 엔트로피를 최소화하거나 정보 획득을 최대화하여 더 좋은 분류를 수행하는 특징과 경계를 결정하는 데 사용됩니다.

결정트리 가지치기

결정 트리(Decision Tree)에서의 "가지치기"는 트리의 깊이를 제한하거나 불필요한 가지(branch)를 제거하여 모델을 간단하고 일반화된 모델로 만드는 과정을 말합니다. 가지치기는 모델의 과적합(Overfitting)을 방지하고 모델의 성능을 향상시키는 중요한 기술 중 하나입니다.

가지치기를 통해 결정 트리를 더 간단하고 효율적으로 만들기 위해 다음과 같은 절차를 따릅니다:

트리의 깊이 제한: 결정 트리는 기본적으로 가능한 한 깊게 분기하려고 합니다. 그러나 너무 깊게 분기하면 학습 데이터에 과적합할 가능성이 높아집니다. 따라서 트리의 최대 깊이를 제한하는 것이 일반적인 가지치기 방법 중 하나입니다. 최대 깊이를 제한하면 트리의 크기가 제어되며, 모델이 덜 복잡해집니다.

노드의 최소 샘플 수 제한: 각 노드에서 분할을 수행하기 전에 해당 노드에 필요한 최소 샘플 수를 설정할 수 있습니다. 이렇게 하면 노드에 샘플 수가 이 값 이하일 때 더 이상 분할하지 않게 됩니다. 이를 통해 작은 데이터셋에서의 과적합을 방지할 수 있습니다.

가지치기 조건 설정: 가지치기는 불필요한 분기를 제거하는 방법 중 하나입니다. 불필요한 분기란 정보 이득(Information Gain)이 낮거나 지니 불순도(Gini Impurity) 등의 불순도 감소가 미미한 분기를 의미합니다. 따라서 분기의 조건을 설정하여 정보 이득이나 불순도 감소가 일정 기준을 충족하지 못할 때 분기를 중단하도록 할 수 있습니다.

가지치기 후에도 재귀적으로 검토: 가지치기를 적용한 후에도 모델을 재귀적으로 검토하여 더 이상 가지를 나눌 필요가 없는 노드를 찾고 제거할 수 있습니다.

결정 트리의 가지치기는 모델의 일반화 능력을 향상시키고 과적합을 방지하기 위한 중요한 요소 중 하나입니다. 적절한 가지치기 기법을 적용하면 더 간결하고 일반화된 모델을 얻을 수 있습니다.

실제 사례를 통한 예

크기와 당도라는 두 가지 특징을 고려하여 과일을 분류하는 문제를 생각해봅시다.

가정

과일의 종류를 사과와 바나나로 분류하고자 합니다. 데이터셋에는 과일의 크기와 당도 정보가 있습니다.

데이터셋

20개의 작은 사과
10개의 큰 사과
5개의 작은 바나나
15개의 큰 바나나
이제 엔트로피를 이용하여 어떤 특징을 선택할지 판단해보겠습니다.

첫 번째 노드 분할 전

작은 사과: 20개
큰 사과: 10개
작은 바나나: 5개
큰 바나나: 15개

이 때의 엔트로피를 계산합니다:

크기로 분할한 경우

작은 사과: 20개
큰 사과: 10개
작은 바나나: 5개
큰 바나나: 15개
이 때의 엔트로피는 1.571입니다. 분할 전보다 엔트로피가 줄어든 것을 볼 수 있습니다.

당도로 분할한 경우

작은 사과: 20개
큰 사과: 9개
작은 바나나: 5개
큰 바나나: 14개
이 때의 엔트로피는 1.743입니다. 크기로 분할한 경우보다 엔트로피가 증가한 것을 볼 수 있습니다.

위의 계산 결과로 보아, 크기를 기준으로 분할했을 때 엔트로피가 가장 낮아지는 것을 알 수 있습니다. 따라서 결정 트리 알고리즘이 크기를 분할 기준으로 선택하게 됩니다. 이렇게 함으로써 데이터를 더 정확하게 분류할 수 있는 규칙을 학습하게 됩니다.

예제

아래는 Python 프로그래밍 언어를 사용하여 scikit-learn 라이브러리를 활용한 간단한 결정 트리 예제 코드입니다. 이 코드는 Iris 데이터셋을 사용하여 꽃의 종류를 분류하는 예제입니다.

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

# 데이터 불러오기
iris = load_iris()
X = iris.data
y = iris.target

# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 결정 트리 모델 생성
model = DecisionTreeClassifier(random_state=42)

# 모델 학습
model.fit(X_train, y_train)

# 테스트 데이터로 예측
y_pred = model.predict(X_test)

# 정확도 평가
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")

이 코드는 scikit-learn 라이브러리를 사용하여 Iris 데이터셋을 불러오고, 결정 트리 모델을 생성하고 학습시키며, 테스트 데이터로 예측을 수행하고 정확도를 평가합니다. scikit-learn은 머신러닝과 데이터 분석을 위한 널리 사용되는 라이브러리로, 다양한 머신러닝 모델을 손쉽게 구현하고 평가할 수 있도록 도와줍니다.

결정트리 시각화

결정 트리의 구조를 시각화하면 각 노드에서의 분기와 결정 규칙을 직접 확인할 수 있습니다. 이를 통해 어떻게 데이터가 분류되거나 예측되는지를 시각적으로 이해할 수 있습니다.

아래는 scikit-learn을 사용하여 결정 트리를 시각화하는 간단한 예제 코드입니다.

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

# 데이터 불러오기
iris = load_iris()
X = iris.data
y = iris.target

# 결정 트리 모델 생성
model = DecisionTreeClassifier(random_state=42)

# 모델 학습
model.fit(X, y)

# 결정 트리 시각화
plt.figure(figsize=(20, 10))
plot_tree(model, filled=True, feature_names=iris.feature_names, class_names=list(iris.target_names))
plt.show()

이 코드는 plot_tree 함수를 사용하여 결정 트리를 시각화합니다. 시각화된 결정 트리는 노드, 분기, 결정 규칙, 클래스 레이블 등을 나타내며, 트리의 각 노드에 대한 정보가 표시됩니다.

시각화된 결정 트리를 보면 루트 노드에서 시작하여 각 내부 노드와 리프 노드로 분기되는 구조를 확인할 수 있습니다. 이를 통해 어떤 특징이 어떤 순서로 사용되어 데이터를 분류하는지를 알 수 있습니다.

해당 게시글은 ChatGPT의 도움을 받아 작성되었습니다.

'AI > Machine-Learning' 카테고리의 다른 글

[sklearn] KFold와 cross_val_score  (0) 2023.08.31
앙상블(Ensemble)  (0) 2023.08.30
[sklearn] K-Nearest Neighbors  (0) 2023.08.30
ROC curve  (0) 2023.08.30
[sklearn] 모델 성능 평가(정확도, f1)  (0) 2023.08.30