의사결정트리의 이해 (1)
의사결정트리는 기계 학습과 데이터 분석에서 널리 사용되는 알고리즘으로, 예측 문제를 해결하는 데 효과적입니다. 이번 글에서는 의사결정트리의 개요와 예측트리(회귀)에 대해 자세히 알아보겠습니다.
의사결정트리의 개요
의사결정트리(Decision Tree)는 의사 결정 규칙과 그 결과를 트리 구조로 나타낸 모델입니다. 트리의 각 노드는 속성을 나타내고, 각 분기는 조건을 나타내며, 각 리프 노드는 결과를 나타냅니다. 의사결정트리는 직관적이며 이해하기 쉬운 모델로, 데이터에 기반한 결정을 시각화하고 설명할 수 있습니다.
주요 개념
- 노드(Node) : 의사 결정 트리의 각 분기점으로, 특정 속성을 기준으로 데이터를 분리합니다.
- 루트 노드(Root Node) : 트리의 최상위 노드로, 전체 데이터에 대한 가장 중요한 속성을 기준으로 분리합니다.
- 리프 노드(Leaf Node) : 최종 결정이나 예측을 나타내는 노드입니다.
- 가지(Branch) : 특정 조건에 따라 데이터를 분리하는 경로입니다.
장점
- 해석 용이성 : 의사 결정 규칙이 명확히 드러나므로 결과를 쉽게 이해하고 설명할 수 있습니다.
- 다양한 문제에 적용 가능 : 회귀와 분류 문제 모두에 적용할 수 있습니다.
- 데이터 전처리 불필요 : 수치형 데이터와 범주형 데이터 모두에 사용 가능하며, 스케일링이 필요하지 않습니다.
단점
- 과적합 : 트리가 너무 깊어질 경우 과적합이 발생할 수 있습니다.
- 불안정성 : 데이터의 작은 변화에도 트리 구조가 크게 변할 수 있습니다.
- 편향 가능성 : 트리의 깊이를 제한하면 편향된 예측이 나올 수 있습니다.
예측트리의 이해 (Regression)
예측트리(Regression Tree)는 의사결정트리를 회귀 분석에 활용한 것으로, 연속적인 값을 예측하는 데 사용됩니다. 회귀 트리는 데이터를 여러 구간으로 분할하여 각 구간의 평균이나 중앙값을 예측값으로 사용합니다.
작동 원리
- 특성 선택 : 가장 중요한 특성을 선택하여 데이터를 분리합니다. 분리 기준은 분산 감소량으로 결정됩니다.
- 구간 분할 : 데이터를 여러 구간으로 나누어, 각 구간의 데이터를 평균이나 중앙값으로 예측합니다.
- 트리 생성 : 루트 노드에서 시작하여 반복적으로 데이터를 분할하여 트리를 생성합니다.
- 예측 : 새로운 데이터 포인트가 주어지면 트리를 따라 내려가면서 예측값을 결정합니다.
수식
- 분산 감소량 : 각 분할 시 데이터의 분산이 얼마나 감소하는지를 측정하여 최적의 분할을 결정합니다.\text{Variance Reduction} = \text{Variance(Parent Node)} - \left(\frac{\text{Samples in Left Node}}{\text{Total Samples}} \times \text{Variance(Left Node)} + \frac{\text{Samples in Right Node}}{\text{Total Samples}} \times \text{Variance(Right Node)}\right)
- 예측값 계산 : 각 리프 노드의 예측값은 해당 구간의 평균값이나 중앙값으로 결정됩니다.\hat{y} = \frac{1}{N} \sum_{i=1}^{N} y_i여기서 \hat{y}는 리프 노드의 예측값이며, N은 해당 구간의 데이터 포인트 수입니다.
예제 코드
Python을 사용하여 의사결정트리를 회귀 문제에 적용하는 코드 예제는 다음과 같습니다.
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeRegressor
import matplotlib.pyplot as plt
import numpy as np
# 데이터 생성
X, y = make_regression(n_samples=200, n_features=1, noise=10, random_state=42)
# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 의사결정트리 회귀 모델 생성
regressor = DecisionTreeRegressor(max_depth=3, random_state=42)
# 모델 학습
regressor.fit(X_train, y_train)
# 예측
y_pred = regressor.predict(X_test)
# 시각화
X_range = np.linspace(X.min(), X.max(), 100).reshape(-1, 1)
y_range_pred = regressor.predict(X_range)
plt.scatter(X, y, color='gray', label='Data')
plt.plot(X_range, y_range_pred, color='red', linewidth=2, label='Regression Tree')
plt.xlabel('Feature')
plt.ylabel('Target')
plt.title('Decision Tree Regression')
plt.legend()
plt.show()
위 코드는 sklearn의 DecisionTreeRegressor를 사용하여 회귀 문제를 해결하고, 결과를 시각화하는 예제입니다.
의사결정트리의 이해 (2)
이어서 의사결정트리의 두 번째 부분에서는 분류트리에 대해 알아보겠습니다.
분류트리의 이해
분류트리(Classification Tree)는 의사결정트리를 분류 문제에 적용한 것으로, 범주형 변수를 예측하는 데 사용됩니다. 분류 트리는 데이터를 다양한 기준으로 분리하여 각 노드에서 예측할 클래스를 결정합니다.
작동 원리
- 특성 선택 : 각 노드에서 데이터 분할 기준이 되는 최적의 특성을 선택합니다. 분할 기준은 정보 획득 또는 지니 계수로 결정됩니다.
- 노드 생성 : 각 노드는 특정 조건에 따라 데이터를 분리하며, 리프 노드는 클래스 레이블을 나타냅니다.
- 트리 생성 : 루트 노드에서 시작하여 반복적으로 데이터를 분할하여 트리를 생성합니다.
- 분류 : 새로운 데이터 포인트가 주어지면 트리를 따라 내려가면서 클래스를 결정합니다.
수식
- 정보 획득(Information Gain) : 특정 특성으로 분할했을 때, 데이터의 불순도가 얼마나 감소하는지를 측정합니다.\text{Information Gain} = \text{Entropy(Parent Node)} - \left(\frac{\text{Samples in Left Node}}{\text{Total Samples}} \times \text{Entropy(Left Node)} + \frac{\text{Samples in Right Node}}{\text{Total Samples}} \times \text{Entropy(Right Node)}\right)
- 지니 계수(Gini Index) : 노드의 불순도를 측정하는 또 다른 방법입니다. 노드가 순수할수록 지니 계수가 낮습니다.\text{Gini Index} = 1 - \sum_{i=1}^{C} p_i^2여기서 C는 클래스의 수이고, p_i는 클래스 i의 비율입니다.
장점
- 해석 용이성 : 트리 구조가 직관적이므로 결과를 쉽게 해석할 수 있습니다.
- 비선형 경계 : 데이터에 비선형 경계를 적용할 수 있습니다.
- 데이터 전처리 불필요 : 범주형 데이터와 수치형 데이터 모두 처리할 수 있습니다.
단점
- 과적합 : 트리가 너무 깊어지면 과적합이 발생할 수 있습니다.
- 데이터의 변동에 민감 : 데이터의 작은 변화에도 모델이 크게 달라질 수 있습니다.
예제 코드
Python을 사용하여 의사결정트리를 분류 문제에 적용하는 코드 예제는 다음과 같습니다.
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn import tree
import matplotlib.pyplot as plt
# 데이터 로드
iris = load_iris()
X, y = iris.data, iris.target
# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 의사결정트리 분류 모델 생성
classifier = DecisionTreeClassifier(max_depth=3, random_state=42)
# 모델 학습
classifier.fit(X_train, y_train)
# 예측
y_pred = classifier.predict(X_test)
# 모델 평가
accuracy = classifier.score(X_test, y_test)
print(f'Accuracy: {accuracy * 100:.2f}%')
# 트리 시각화
plt.figure(figsize=(12,8))
tree.plot_tree(classifier, feature_names=iris.feature_names, class_names=iris.target_names, filled=True)
plt.title('Decision Tree Classifier')
plt.show()
위 코드는 sklearn의 DecisionTreeClassifier를 사용하여 Iris 데이터셋의 분류 문제를 해결하고, 트리를 시각화하는 예제입니다.
이번 글에서는 의사결정트리의 기본 개념과 예측트리(회귀), 분류트리의 작동 원리 및 적용 방법에 대해 알아보았습니다. 의사결정트리는 직관적이며 해석이 용이한 모델로, 다양한 데이터 분석 및 예측 문제에 효과적으로 활용될 수 있습니다. 이를 통해 복잡한 의사 결정 문제를 해결하는 데 기여할 수 있습니다.
'인공지능학 > 기계학습' 카테고리의 다른 글
[기계학습] 10. 고차원 데이터의 차원 축소 (2) | 2024.09.15 |
---|---|
[기계학습] 9. 앙상블 학습의 이해, 랜덤 포레스트 모델의 이해 (2) | 2024.08.20 |
[기계학습] 7. 서포트벡터머신의 이해 (0) | 2024.08.07 |
[기계학습] 6. 군집화의 이해 (0) | 2024.08.06 |
[기계학습] 5. KNN 알고리즘과 로지스틱 회귀모델 (0) | 2024.08.05 |