의사결정나무(Decision Tree)는 분류(Classification)와 회귀(Regression) 문제에 모두 사용할 수 있는 지도 학습(Supervised Learning) 알고리즘입니다. 데이터에서 규칙 기반의 의사결정을 통해 목표 변수를 예측합니다.

1. 의사결정나무의 구조
- 노드(Node):
- 결정 노드(Decision Node): 특정 조건에 따라 데이터를 분할.
- 단말 노드(Leaf Node): 최종 출력 값을 예측(분류 또는 회귀 결과).
- 분기(Branch):
- 각 노드는 조건에 따라 분기를 통해 데이터를 두 그룹으로 나눕니다.
Root Node
├── Decision Node (Condition: X < 5)
│ ├── Leaf Node (Class A)
│ └── Leaf Node (Class B)
└── Decision Node (Condition: X >= 5)
├── Leaf Node (Class C)
└── Leaf Node (Class D)
2. 의사결정나무의 주요 개념
(1) 정보 이득(Information Gain)
- 데이터를 분할할 때 얼마나 유용한 정보를 얻는지를 측정.
- *엔트로피(Entropy)를 기준으로 계산:
(2) 지니 지수(Gini Impurity)
- 불순도를 측정하여 분할의 질을 평가
- : 특정 클래스에 속할 확률.
(3) CART (Classification and Regression Tree)
- 사이킷런의 의사결정나무는 CART 알고리즘을 사용.
- 분류: 지니 지수 또는 엔트로피 기반.
- 회귀: 평균 제곱 오차(MSE) 기반.
3. 의사결정나무의 장단점
장점:
- 해석 용이: 결과가 트리 구조로 제공되어 이해하기 쉽습니다.
- 특성 스케일링 불필요: 정규화나 표준화가 필요하지 않음.
- 다양한 데이터 처리 가능: 수치형 및 범주형 데이터 모두 처리 가능.
단점:
- 과적합(Overfitting): 트리가 너무 깊어질 경우 훈련 데이터에 과적합될 수 있습니다.
- 일반화 성능 저하: 새로운 데이터에 대한 예측력이 떨어질 수 있음.
- 불안정성: 데이터의 작은 변화로 트리 구조가 크게 바뀔 수 있습니다.
4. 의사결정나무 알고리즘의 활용 예시
(1) 분류 문제
- 이메일 스팸 필터링.
- 고객 세그먼트 분석.
(2) 회귀 문제
- 주택 가격 예측.
- 특정 시간대의 온도 예측.
5. Python을 활용한 의사결정나무 구현
*사이킷런(Scikit-learn)을 사용하여 의사결정나무를 구현하는 예시입니다.
(1) 분류 모델
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn import tree
import matplotlib.pyplot as plt
# 데이터 로드
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=42)
# 의사결정나무 분류 모델 학습
clf = DecisionTreeClassifier(criterion='gini', max_depth=3, random_state=42)
clf.fit(X_train, y_train)
# 시각화
plt.figure(figsize=(12, 8))
tree.plot_tree(clf, feature_names=iris.feature_names, class_names=iris.target_names, filled=True)
plt.show()
(2) 회귀 모델
from sklearn.tree import DecisionTreeRegressor
from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split
# 데이터 로드
X, y = load_diabetes(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 의사결정나무 회귀 모델 학습
reg = DecisionTreeRegressor(max_depth=3, random_state=42)
reg.fit(X_train, y_train)
# 예측 및 평가
predictions = reg.predict(X_test)
6. 의사결정나무의 개선
(1) 가지치기(Pruning)
- 사전 가지치기(Pre-pruning): 트리가 너무 깊어지지 않도록 최대 깊이(max_depth) 설정.
- 사후 가지치기(Post-pruning): 모델 학습 후 불필요한 노드를 제거.
(2) 앙상블 기법
- 랜덤 포레스트(Random Forest): 여러 의사결정나무의 예측을 평균화하여 성능 향상.
- 그래디언트 부스팅(Gradient Boosting): 순차적 모델 학습으로 예측 정확도를 높임.
7. 요약
- 의사결정나무는 데이터를 규칙 기반으로 분할하여 예측하는 직관적인 알고리즘입니다.
- 분류와 회귀 모두에 사용 가능하며, 결과를 쉽게 해석할 수 있는 장점이 있습니다.
- 과적합 문제를 해결하기 위해 가지치기 또는 앙상블 기법을 활용할 수 있습니다.
사이킷런에서 제공하는 붓꽃데이터 세트 기반 ML 분류예측 수행 프로젝트 프로세스
반응형
'데이터사이언티스트 Data Scientist' 카테고리의 다른 글
[지도학습] 분류(Classificaion) - (1) 의사결정나무(Decision Tree) 모델 (1) | 2024.11.08 |
---|---|
고유값(Eigenvalue) (1) | 2024.11.07 |
Train Data 와 Test Data 를 나누는 이유 (2) | 2024.11.07 |
사이킷런(scikit-learn) 이란? (0) | 2024.11.07 |
요인 분석(Factor Analysis), 그리고 분석 절차 (4) | 2024.11.06 |