move84

트리 가지치기(Tree Pruning): 머신러닝 모델 최적화 본문

머신러닝

트리 가지치기(Tree Pruning): 머신러닝 모델 최적화

move84 2025. 4. 14. 07:52
반응형

트리 모델은 이해하기 쉽고 직관적이지만, 과적합(Overfitting)의 위험이 있습니다. 과적합은 모델이 훈련 데이터에만 너무 맞춰져 새로운 데이터에 대한 예측 성능이 떨어지는 현상을 의미합니다. 이러한 문제를 해결하기 위해 트리 가지치기(Tree Pruning)가 사용됩니다. 이 글에서는 트리 가지치기의 개념, 필요성, 다양한 방법, 그리고 실제 코드 예제를 통해 자세히 알아보겠습니다.


🌳 가지치기(Pruning)란 무엇인가?
가지치기는 트리 모델의 복잡성을 줄여 과적합을 방지하는 기술입니다. 트리의 가지를 쳐내어 잎 노드(Leaf Node)의 개수를 줄이고, 모델을 단순화합니다. 단순화된 모델은 훈련 데이터에 대한 정확도는 다소 떨어질 수 있지만, 새로운 데이터에 대한 일반화 성능을 향상시킵니다. 즉, 모델이 더 다양한 상황에 잘 대처할 수 있게 됩니다.


🤔 왜 가지치기가 필요할까?
트리 모델은 데이터를 완벽하게 분류하기 위해 계속해서 분할을 시도합니다. 이러한 과정에서 훈련 데이터에만 존재하는 노이즈나 이상치까지 학습하게 되어 과적합이 발생합니다. 과적합된 모델은 훈련 데이터에서는 높은 정확도를 보이지만, 실제 환경에서는 예측 성능이 떨어집니다. 가지치기를 통해 모델의 복잡성을 줄이면 과적합을 방지하고, 일반화 성능을 높일 수 있습니다. 예를 들어, 특정 고객의 구매 패턴을 완벽하게 학습한 모델은 다른 고객에게는 적용하기 어려울 수 있습니다. 하지만 가지치기를 통해 중요한 특징만 학습한 모델은 더 많은 고객에게 일반화될 수 있습니다.


✂️ 가지치기 방법
가지치기 방법은 크게 사전 가지치기(Pre-Pruning)와 사후 가지치기(Post-Pruning)로 나눌 수 있습니다.

  1. 사전 가지치기(Pre-Pruning): 트리를 만들 때 미리 가지치기 조건을 설정하여 트리의 성장을 제한합니다. 예를 들어, 최대 깊이(Maximum Depth)나 최소 분할 샘플 수(Minimum Samples Split)와 같은 하이퍼파라미터를 설정하여 트리가 너무 깊게 성장하지 않도록 합니다.

  2. 사후 가지치기(Post-Pruning): 트리를 완전히 성장시킨 후, 성능이 낮은 가지를 제거합니다. 예를 들어, 비용 복잡도 가지치기(Cost Complexity Pruning)는 트리의 복잡도와 정확도를 고려하여 가지를 제거합니다.

사전 가지치기는 구현이 간단하지만, 너무 강하게 가지치기를 하면 underfitting이 발생할 수 있습니다. 사후 가지치기는 더 정확한 가지치기가 가능하지만, 계산 비용이 많이 들 수 있습니다.


🧮 비용 복잡도 가지치기(Cost Complexity Pruning)
비용 복잡도 가지치기는 트리의 복잡도와 정확도를 함께 고려하여 가지를 제거하는 방법입니다. 이 방법은 복잡도 파라미터(Complexity Parameter, ccp_alpha)를 사용하여 트리의 각 노드에 대한 비용 복잡도(Cost Complexity)를 계산합니다.

비용 복잡도는 다음과 같이 정의됩니다.

R(T) + alpha * |T|

여기서 R(T)는 트리 T의 오분류율(Misclassification Rate)을 나타내고, |T|는 트리 T의 잎 노드 수를 나타냅니다. alpha는 복잡도 파라미터로, alpha 값이 클수록 트리의 복잡성에 대한 페널티가 커집니다.

비용 복잡도 가지치기는 alpha 값을 증가시키면서 트리의 가지를 하나씩 제거합니다. 각 단계에서 비용 복잡도가 가장 작은 가지를 제거하고, 그 결과를 평가하여 최적의 트리를 선택합니다.

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

# Iris 데이터셋 로드
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.3, random_state=42)

# Decision Tree 모델 생성
dtree = DecisionTreeClassifier(random_state=42)

# 모델 훈련
dtree.fit(X_train, y_train)

# 비용 복잡도 가지치기
path = dtree.cost_complexity_pruning_path(X_train, y_train)
ccp_alphas, impurities = path.ccp_alphas, path.impurities

# 각 alpha 값에 대한 트리 모델 훈련 및 평가
trees = []
for ccp_alpha in ccp_alphas:
    dtree = DecisionTreeClassifier(random_state=42, ccp_alpha=ccp_alpha)
    dtree.fit(X_train, y_train)
    trees.append(dtree)

# 테스트 데이터로 각 트리 모델 평가
train_scores = [tree.score(X_train, y_train) for tree in trees]
test_scores = [tree.score(X_test, y_test) for tree in trees]

# 최적의 alpha 값 선택
best_alpha_index = test_scores.index(max(test_scores))
best_alpha = ccp_alphas[best_alpha_index]

print(f"Best alpha: {best_alpha}")

위 코드에서는 cost_complexity_pruning_path 함수를 사용하여 다양한 alpha 값에 대한 비용 복잡도를 계산하고, 각 alpha 값에 대해 트리 모델을 훈련하고 평가합니다. 테스트 데이터에 대한 정확도가 가장 높은 alpha 값을 선택하여 최적의 트리 모델을 결정합니다.


🧪 하이퍼파라미터 튜닝
트리 모델의 성능을 최적화하기 위해 다양한 하이퍼파라미터를 튜닝할 수 있습니다. 주요 하이퍼파라미터는 다음과 같습니다.

  • max_depth: 트리의 최대 깊이를 제한합니다. 값이 클수록 모델이 복잡해지고 과적합될 가능성이 높아집니다.
  • min_samples_split: 노드를 분할하기 위한 최소 샘플 수를 지정합니다. 값이 클수록 모델이 단순해지고 underfitting될 가능성이 높아집니다.
  • min_samples_leaf: 잎 노드가 되기 위한 최소 샘플 수를 지정합니다. 값이 클수록 모델이 단순해지고 underfitting될 가능성이 높아집니다.
  • ccp_alpha: 비용 복잡도 가지치기에 사용되는 복잡도 파라미터입니다. 값이 클수록 트리의 복잡성에 대한 페널티가 커집니다.

이러한 하이퍼파라미터를 적절히 튜닝하여 모델의 일반화 성능을 최적화할 수 있습니다.


트리 가지치기는 머신러닝 모델의 과적합을 방지하고 일반화 성능을 향상시키는 중요한 기술입니다. 사전 가지치기와 사후 가지치기를 이해하고, 비용 복잡도 가지치기와 같은 방법을 사용하여 모델을 최적화할 수 있습니다. 또한, 하이퍼파라미터 튜닝을 통해 모델의 성능을 더욱 향상시킬 수 있습니다.


핵심 용어 정리

  • 과적합 (Overfitting): 모델이 훈련 데이터에 너무 맞춰져 새로운 데이터에 대한 예측 성능이 떨어지는 현상
  • 가지치기 (Pruning): 트리 모델의 복잡성을 줄여 과적합을 방지하는 기술
  • 사전 가지치기 (Pre-Pruning): 트리를 만들 때 미리 가지치기 조건을 설정하여 트리의 성장을 제한하는 방법
  • 사후 가지치기 (Post-Pruning): 트리를 완전히 성장시킨 후, 성능이 낮은 가지를 제거하는 방법
  • 비용 복잡도 가지치기 (Cost Complexity Pruning): 트리의 복잡도와 정확도를 함께 고려하여 가지를 제거하는 방법
  • 복잡도 파라미터 (Complexity Parameter, ccp_alpha): 비용 복잡도 가지치기에 사용되는 파라미터
반응형