일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- AI
- python
- 지도 학습
- Deep learning
- reinforcement learning
- 자연어 처리
- 회귀
- 강화 학습
- 신경망
- GRU
- 정규화
- 분류
- 머신러닝
- q-러닝
- 딥러닝
- 데이터 전처리
- rnn
- 머신 러닝
- Q-Learning
- CNN
- Machine Learning
- 손실 함수
- 활성화 함수
- 최적화
- 인공지능
- 과적합
- 인공 신경망
- 강화학습
- 교차 검증
- LSTM
- Today
- Total
move84
머신러닝 기초 - 결정 트리: 구성과 가지치기 본문
😀 결정 트리란 무엇인가?
결정 트리는 데이터를 분류하거나 회귀 분석을 수행할 때 사용하는 트리 구조의 예측 모델이다. 마치 의사결정을 내릴 때 "만약 ~라면, 그렇지 않다면 ~"의 규칙을 반복하는 것처럼, 데이터의 특징들을 기준으로 분기를 나누어 최종 결과를 예측한다. 결정 트리는 시각적으로 이해하기 쉬워 초보자들도 데이터가 어떻게 분류되는지 한눈에 볼 수 있다.
📈 결정 트리의 구성 원리
결정 트리는 루트 노드에서 시작해 여러 내부 노드와 리프 노드(종단 노드)로 구성된다.
- 루트 노드(Root Node): 모든 데이터를 포함하는 시작점.
- 내부 노드(Internal Node): 데이터를 특정 기준에 따라 분할하는 노드.
- 리프 노드(Leaf Node): 최종 예측 결과가 나타나는 노드.
각 노드에서는 주로 엔트로피(Entropy)나 지니 불순도(Gini Impurity)와 같은 지표를 사용해 데이터를 분할한다. 예를 들어, 한 학생의 시험 점수와 공부 시간에 따라 합격 여부를 예측한다고 할 때, "공부 시간이 3시간 이상인가?"와 같은 질문으로 데이터를 분할하면, 보다 순수한 그룹으로 나눌 수 있다.
💻 파이썬 코드 예제: 아이리스 데이터셋으로 결정 트리 구현
아래 코드는 사이킷런을 사용해 아이리스(Iris) 데이터셋에 대해 결정 트리 분류기를 구축하고, 가지치기(pruning)를 통해 모델의 과적합을 방지하는 간단한 예제다. 초보자가 결정 트리의 구성과 가지치기 개념을 이해하는 데 도움이 될 것이다.
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier, plot_tree
from sklearn.metrics import accuracy_score, classification_report
# 아이리스 데이터셋 로드
iris = load_iris()
X = iris.data # 특징: 꽃받침 길이, 꽃받침 너비, 꽃잎 길이, 꽃잎 너비
y = iris.target # 클래스: 0, 1, 2
# 데이터셋을 훈련 세트와 테스트 세트로 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 결정 트리 모델 생성 (최대 깊이 제한을 통해 가지치기 효과 적용)
dt_classifier = DecisionTreeClassifier(max_depth=3, random_state=42)
dt_classifier.fit(X_train, y_train)
# 테스트 데이터에 대해 예측 수행
y_pred = dt_classifier.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print("정확도:", accuracy)
print("\n분류 보고서:\n", classification_report(y_test, y_pred))
# 결정 트리 시각화
plt.figure(figsize=(12, 8))
plot_tree(dt_classifier, feature_names=iris.feature_names, class_names=iris.target_names, filled=True)
plt.title("결정 트리 시각화 (max_depth=3)")
plt.show()
이 코드는 아이리스 데이터셋을 불러와 훈련과 테스트 데이터로 분할한 후, 최대 깊이(max_depth)를 3으로 제한해 결정 트리를 학습시킨다. 최대 깊이 제한은 가지치기의 한 형태로, 과도한 분할로 인한 과적합(overfitting)을 방지해준다. 최종적으로 모델의 정확도와 분류 보고서를 출력하며, 결정 트리 구조를 시각화하여 각 분기점의 조건과 예측 결과를 확인할 수 있다.
🌟 가지치기(Pruning)의 중요성
결정 트리는 데이터에 과적합되기 쉬운데, 이는 트리가 너무 복잡해져서 훈련 데이터에는 잘 맞지만 새로운 데이터에 대해 예측 성능이 떨어지는 현상이다. 가지치기는 트리의 복잡도를 줄여 일반화 성능을 높이는 기법이다.
- 사전 가지치기(Pre-pruning): 트리의 최대 깊이나 최소 샘플 수 등의 하이퍼파라미터를 설정해 미리 가지치기를 적용하는 방법이다.
- 사후 가지치기(Post-pruning): 완전히 성장한 트리에서 불필요한 가지를 후처리로 제거하는 방법이다.
예를 들어, 학생의 시험 점수를 예측하는 모델에서 너무 세세한 분기가 이루어지면, 모델은 특정 학생에게만 맞춰질 수 있다. 가지치기를 통해 이러한 과적합 문제를 완화할 수 있다.
📚 중요 용어 정리
- 엔트로피(Entropy): 데이터의 불확실성을 측정하는 지표로, 값이 높을수록 데이터가 섞여 있음을 의미한다.
- 지니 불순도(Gini Impurity): 분할 후 노드의 순수도를 평가하는 또 다른 지표. 값이 낮을수록 순수한 노드를 의미한다.
- 과적합(Overfitting): 모델이 훈련 데이터에 너무 맞춰져서 새로운 데이터에 대해 예측 성능이 낮은 상태.
- 가지치기(Pruning): 결정 트리의 불필요한 분기를 제거해 모델의 복잡도를 줄이고 일반화 성능을 개선하는 기법.
📊 초보자를 위한 비유와 예시
결정 트리를 이해하는 데 도움이 되는 비유로, "결정 트리는 나무와 같다"라는 예시를 들어보자.
나무는 뿌리에서 시작해 여러 갈래로 가지를 뻗어 나간다. 만약 가지가 너무 많이 뻗어나가면, 나무 전체가 불안정해질 수 있다. 이때, 과도한 가지들을 잘라내면(가지치기) 나무가 더 건강하게 자랄 수 있는 것처럼, 결정 트리도 불필요한 분기를 제거해 모델의 안정성을 높인다.
또 다른 예로, 요리 레시피를 생각해보자. 재료를 너무 세세하게 나누어 조리 과정을 복잡하게 만들면 실수할 확률이 높아진다. 간단하게 핵심 재료만 골라 조리하면, 맛있는 결과를 얻을 수 있는 것과 비슷하다.
📌 실제 응용 분야와 전망
결정 트리는 금융, 의료, 마케팅, 제조 등 다양한 분야에서 널리 사용된다. 예를 들어, 금융 분야에서는 고객의 신용 등급을 예측하거나, 의료 분야에서는 질병 진단을 위한 분류 모델로 활용된다.
최근에는 앙상블 기법(랜덤 포레스트, 부스팅 등)과 결합해 결정 트리의 약점을 보완하는 연구가 활발하다. 결정 트리는 해석하기 쉬운 모델이기 때문에, 모델의 결정 과정을 설명해야 하는 분야에서 특히 유리하다. 앞으로도 결정 트리 기반 모델은 다양한 데이터 분석 문제에 효과적으로 사용될 전망이다.
📌 결론 및 요약
결정 트리는 데이터를 분류하고 예측하는 데 강력한 도구로, 루트 노드에서 시작해 각 노드에서 조건에 따라 분기하고, 최종 리프 노드에서 예측 결과를 도출한다. 하지만 너무 깊게 성장하면 과적합 문제가 발생하므로 가지치기를 통해 모델의 복잡도를 줄이는 것이 중요하다.
초보자들은 파이썬 코드 예제와 함께 엔트로피, 지니 불순도, 과적합, 가지치기와 같은 핵심 용어를 이해하며, 결정 트리 모델이 어떻게 구성되고 작동하는지 체험해볼 필요가 있다. 이러한 이해를 바탕으로 실제 데이터 분석 문제에 결정 트리 모델을 효과적으로 적용할 수 있을 것이다.
키워드: #결정트리 #가지치기 #머신러닝기초 #파이썬코드
'머신러닝' 카테고리의 다른 글
머신러닝 기초 - 그라디언트 부스팅 머신 (1) | 2025.02.20 |
---|---|
머신러닝 기초 - 랜덤 포레스트: 앙상블 학습의 모든 것 (0) | 2025.02.20 |
머신러닝 기초 - 다중 분류 로지스틱 회귀 기법 (0) | 2025.02.20 |
머신러닝 기초 - 로지스틱 회귀를 이용한 이진 분류 (0) | 2025.02.20 |
머신러닝 기초 - 다항 회귀 방법론 (0) | 2025.02.20 |