Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Archives
Today
Total
관리 메뉴

개발하는 뚱이

🌲의사결정 트리란??(Ei : Ez Ai) 본문

Ei(Ez Ai)

🌲의사결정 트리란??(Ei : Ez Ai)

hyohyeon 2024. 10. 5. 01:22

의사결정 트리가 무엇일까??

의사결정 트리는 회귀와 분류가 모두 가능한 지도학습의 모델  중 하나입니다.

의사결정 트리는 스무고개 하듯이 질문하고 데이터의 특징을 찾아내 분류를 합니다.

 

아래 그림을 보면 쉽게 이해가 가능합니다.

이렇게 질문에 따라 데이터를 구분하는 모델을 결정트리 모델이라고 합니다.

그렇게 더 이상 질문할 것이 없고 데이터가 균일하다고 판단될 경우 그 값은 리프 노드가 됩니다.

 

자! 한 번 어떻게 작동이 되는지 알아봅시다.

작동 방식

출처 : 텐서 플로우 블로그

위 사진과 같이 데이터를 잘 구분할 수 있는 질문으로 데이터를 나눕니다.

출처 : 텐서 플로우 블로그

나뉜 범주에서 또다시 데이터를 가장 잘 구분할 수 있는 질문을 하여 나눕니다.

하지만 이를 너무 많이 하면 아래와 같은 상황이 발생합니다.

출처 : 텐서 플로우 블로그

위 사진은 오버피팅이 발생한 사진입니다. 이렇게 오버피팅이 발생하지 않게 분기를 적절히 설정하거나 가지치기를 활용하는 것이 중요합니다. 

오버피팅 : 머신러닝 모델이 학습 데이터에 너무 과하게 맞춰져서, 새로운 데이터(테스트 데이터)에 대한 예측 성능이 떨어지는 현상
분기 : 데이터를 두 개 이상의 그룹으로 나누는 과정

 

자, 그렇다면 이제 의사결정 트리의 다른 중요 개념을 알아보겠습니다.

 

불순도

불순도는 해당 범주안에 서로 다른 데이터가 얼마큼 섞여 있는지를 뜻합니다.

불순도는 분기 기준을 설정할 때 최대한 줄이는 방향으로 설정해야 데이터가 더 잘 구분이 되고

모델의 예측 성능이 높아집니다.

 

이제 우리는 불순도를 측정을 해야 합니다. 이러한 불순도를 측정하는 방법은 엔트로피지니 지수가 있습니다.

 

엔트로피

엔트로피는 데이터가 얼마나 섞여 있는지를 나타내는 지표입니다.

엔트로피가 클수록 여러 그룹이 섞여있고, 작을수록 하나의 그룹이 모여있음을 의미합니다.

쉽게 예시를 들어보겠습니다.

 

만약 비둘기 10마리와 갈매기 10마리가 있다면 어떤 것이 비둘기인지 갈매기인지 헷갈릴 수 있습니다.

이때 엔트로피는 높습니다.

반면에, 모두 비둘기만 있다면 헷갈리지 않겠죠??? 이때 엔트로피는 0입니다.

 

엔트로피는 불확실성을 나타냅니다. 데이터가 잘 구분되지 않을수록 엔트로피가 커지고, 한쪽으로 치우칠수록 엔트로피는 작아집니다.

 

지니 지수

지니 지수는 두 데이터가 서로 다른 그룹에 속할 확률을 나타냅니다.

이는 데이터가 얼마나 균등하게 분포되어 있는지를 측정하는 또 다른 방법입니다.

쉽게 예시를 들어보겠습니다.

 

만약 밖에 비둘기만 있으면 지니 지수는 0입니다.

하지만 비둘기와 갈매기가 반반 있다면, 지니 지수는 0.5로 가장 커집니다.(0.5가 제일 큼)

 

지니 지수는 두 데이터가 서로 다른 그룹에 속할 확률을 나타냅니다. 값이 작을수록 불순도가 낮고, 값이 클수록 데이터가 섞여 있음을 의미합니다.

 

 

정보 획득

정보 획득은 데이터를 나누었을 때 불순도가 얼마나 줄어들었는지를 나타내는 지표입니다.

의사결정 트리에서 데이터 분할 시 어떤 특징을 기준으로 나눌지 선택할 때 매우 중요한 역할을 합니다.

 

정보이득은 분기 이전의 불순도와 분기 이후의 불순도 차이로 계산합니다. 여기서 말하는 불순도는 엔트로피나 지니 지수로 측정한 값을 말합니다.

 

정보 획득이 클수록 데이터가더 잘 나뉘었다는 뜻입니다. 따라서 의사결정트리는 정보 획득이 가장 큰 특성을 선택하여 데이터를 나누어 갑니다.

 

 

가지치기

가지치기는 불필요한 노드를 제거하여 오버피팅을 막는 기법입니다. 트리에 가지가 너무 많다면 과적합이 발생할 수 있는데 가지치기를 하여 과적합 문제를 해결할 수 있습니다. 이렇게 하여 모델의 성능을 높일 수 있습니다.

 

가지치기에서도 사전 가지치기사후 가지치기가 있습니다.

 

사전 가지치기 : 트리를 생성하는 도중 가지치기를 하는 방법

       - 노드를 계속 확장하지 않고, 미리 정해놓은 기준에 따라 트리의 성장을 멈춤

       - 트리의 깊이를 제한하거나 노드에 속한 데이터가 너무 적으면 더 이상 나누지 않는 방법이 존재

       - 장점 : 모델이 간단

       - 단점 : 너무 일찍 멈추면 중요 패턴을 놓칠 수 있음

 

사후 가지치기 : 트리를 완전히 다 만든 후에 가지치기를 하는 방법

       - 성능에 큰 영향을 주지 않는 가지들을 잘라내는 방식

       - 장점: 더 많은 정보를 바탕으로 필요 없는 노드를 정확하게 제거할 수 있음

       - 단점: 계산 비용이 좀 더 많이 듭니다.(컴퓨터의 연산 시간이나 메모리 사용량이 많음)

 

 

 

간단 요약 

       - 의사결정 트리는 회귀와 분류가 모두 가능한 지도학습의 모델

       - 불순도는 해당 범주안에 서로 다른 데이터가 얼마큼 섞여 있는지를 뜻함

       - 엔트로피는 데이터가 얼마나 섞여 있는지를 나타내는 지표

       - 지니 지수는 두 데이터가 서로 다른 그룹에 속할 확률

       - 정보 획득은 데이터를 나누었을 때 불순도가 얼마나 줄어들었는지를 나타내는 지표

       - 가지치기는 오버피팅을 막기 위한 기법(불필요한 노드를 제거)

 

코드 구현

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn import tree
import matplotlib.pyplot as plt

# Iris 데이터셋을 로드합니다
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)

# 의사결정 트리 모델을 초기화하고 훈련시킵니다
clf = DecisionTreeClassifier()
clf.fit(X_train, y_train)

# 테스트 세트를 사용하여 예측을 수행합니다
y_pred = clf.predict(X_test)

# 정확도를 출력합니다
print("Accuracy:", accuracy_score(y_test, y_pred))

# 의사결정 트리 시각화
plt.figure(figsize=(10, 8))
tree.plot_tree(clf, feature_names=iris.feature_names, class_names=iris.target_names, filled=True)
plt.show()

이 코드는 아이리스 붓꽃을 의사결정 트리로 분류하는 코드입니다.

코드를 읽어 보면서 흐름을 아는 것이 중요합니다.

이해가 안 되더라도 한 번씩 읽어보는 것을 권장합니다.

언제나 배우며 성장하는 학생입니다.

정리한 것 중 잘못된 거나 추가 사항이 있으시다면 피드백을 남겨주시면 정말 감사하겠습니다.

 

이메일 : hyohyeonkim08@gmail.com

깃허브 : https://github.com/hyohyeon08