move84

머신러닝: 결정 트리(Decision Tree)와 기본 작동 원리 본문

머신러닝

머신러닝: 결정 트리(Decision Tree)와 기본 작동 원리

move84 2025. 4. 10. 07:55
반응형

결정 트리(Decision Tree)는 머신러닝에서 널리 사용되는 지도 학습 알고리즘 중 하나이다. 데이터의 특징(feature)을 기반으로 의사 결정을 내리는 과정을 트리 구조로 표현하며, 분류(classification)와 회귀(regression) 문제에 모두 적용 가능하다. 이해하기 쉽고 시각적으로 표현하기 용이하여 많은 분야에서 활용되고 있다.


🌱 결정 트리(Decision Tree)란?
결정 트리(Decision Tree)는 데이터를 분석하여 의사 결정을 위한 규칙을 트리 형태로 표현하는 모델이다. 각 노드(node)는 특징(feature)에 대한 테스트를 나타내고, 가지(branch)는 테스트 결과에 따른 분기(branching)를 나타낸다. 리프 노드(leaf node)는 최종 결정 또는 예측값을 나타낸다. 결정 트리는 데이터를 분할하는 과정을 반복하여 트리를 성장시키며, 목표 변수(target variable)의 예측 정확도를 높이는 방향으로 학습한다.

  • 결정 트리 (Decision Tree): 데이터를 분석하여 의사 결정을 위한 규칙을 트리 형태로 표현하는 모델
  • 노드 (Node): 특징에 대한 테스트를 나타내는 트리 구성 요소
  • 가지 (Branch): 테스트 결과에 따른 분기
  • 리프 노드 (Leaf Node): 최종 결정 또는 예측값을 나타내는 노드
  • 특징 (Feature): 데이터를 설명하는 변수

⚙️ 결정 트리의 작동 원리
결정 트리의 학습 과정은 데이터를 가장 잘 분할하는 특징과 분할 기준을 찾는 과정이다. 이 과정은 재귀적으로 반복되며, 각 분할은 정보 획득(information gain)을 최대화하거나 불순도(impurity)를 최소화하는 방향으로 이루어진다. 주요 작동 원리는 다음과 같다.

  1. 특징 선택 (Feature Selection)
    결정 트리는 데이터를 분할할 최적의 특징을 선택한다. 특징 선택은 정보 획득(information gain), 지니 불순도(Gini impurity), 엔트로피(entropy) 등의 기준을 사용하여 이루어진다.

    • 정보 획득 (Information Gain): 특정 특징으로 데이터를 분할했을 때 얻는 정보량
    • 지니 불순도 (Gini Impurity): 데이터 집합의 불순도를 측정하는 지표. 값이 낮을수록 순수하다.
    • 엔트로피 (Entropy): 데이터 집합의 무질서도를 측정하는 지표. 값이 낮을수록 순수하다.

    예를 들어, 환자의 증상 데이터를 기반으로 질병을 예측하는 결정 트리를 생각해 보자. 특징으로는 '기침', '열', '두통' 등이 있을 수 있다. 결정 트리는 이러한 특징들을 평가하여 질병을 가장 잘 예측할 수 있는 특징을 선택한다. 정보 획득이 가장 높은 특징, 예를 들어 '열'이 선택되면, '열'을 기준으로 데이터를 분할한다.

    # 예시: 정보 획득 계산
    def calculate_entropy(data):
        entropy = 0
        labels = set(data)
        for label in labels:
            p = data.count(label) / len(data)
            entropy -= p * math.log2(p)
        return entropy
    
    def calculate_information_gain(data, feature):
        total_entropy = calculate_entropy(data['target'])
        values = set(data[feature])
        weighted_entropy = 0
        for value in values:
            subset = data[data[feature] == value]['target']
            weighted_entropy += (len(subset) / len(data)) * calculate_entropy(subset)
        return total_entropy - weighted_entropy

  1. 분할 기준 (Splitting Criteria)
    선택된 특징을 기준으로 데이터를 분할하는 기준을 결정한다. 수치형 특징(numerical feature)의 경우 특정 값(threshold)을 기준으로 데이터를 나누고, 범주형 특징(categorical feature)의 경우 각 범주(category)에 따라 데이터를 분할한다.

    • 수치형 특징 (Numerical Feature): 연속적인 값을 가지는 특징 (예: 온도, 나이)
    • 범주형 특징 (Categorical Feature): 불연속적인 값을 가지는 특징 (예: 성별, 혈액형)

    예를 들어, '열'이라는 특징이 선택되었다면, '열'의 값을 기준으로 데이터를 분할한다. 예를 들어, '열이 38도 이상'인 경우와 '열이 38도 미만'인 경우로 데이터를 나눌 수 있다. 이 기준에 따라 환자 데이터를 두 그룹으로 나누어 각각 다른 질병을 예측할 수 있도록 한다.


  1. 트리 성장 (Tree Growing)
    분할된 각 데이터 집합에 대해 1단계와 2단계를 재귀적으로 반복한다. 이 과정은 특정 조건이 만족될 때까지 계속된다. 예를 들어, 모든 데이터가 동일한 클래스에 속하거나, 특정 노드의 데이터 수가 너무 적어 더 이상 분할할 필요가 없을 때 트리의 성장을 멈춘다.

    # 예시: 재귀적 트리 성장
    def build_tree(data, features):
        # 종료 조건: 모든 데이터가 동일한 클래스에 속하거나, 특징이 더 이상 없을 때
        if len(set(data['target'])) == 1 or not features:
            return {'class': data['target'].iloc[0]}
    
        # 최적의 특징 선택
        best_feature = max(features, key=lambda feature: calculate_information_gain(data, feature))
    
        # 트리를 구성
        tree = {best_feature: {}}
        for value in set(data[best_feature]):
            subset = data[data[best_feature] == value]
            remaining_features = [f for f in features if f != best_feature]
            tree[best_feature][value] = build_tree(subset, remaining_features)
    
        return tree

  1. 가지치기 (Pruning)
    트리의 복잡도를 줄이고 과적합(overfitting)을 방지하기 위해 가지치기를 수행한다. 가지치기는 트리의 일부 노드를 제거하거나 병합하여 모델의 일반화 성능(generalization performance)을 향상시킨다.

    • 과적합 (Overfitting): 모델이 학습 데이터에 너무 특화되어 새로운 데이터에 대한 예측 성능이 떨어지는 현상
    • 일반화 성능 (Generalization Performance): 모델이 학습하지 않은 새로운 데이터에 대해 얼마나 정확하게 예측하는지를 나타내는 성능

    예를 들어, 학습 데이터에만 존재하는 특정 패턴을 학습한 트리는 새로운 데이터에 대해 잘못된 예측을 할 가능성이 높다. 가지치기를 통해 이러한 패턴을 제거하고, 더 일반적인 규칙을 학습하도록 한다. 가지치기는 트리의 크기를 줄여 모델의 복잡성을 낮추고, 예측 성능을 향상시키는 데 기여한다.

    # 예시: 가지치기
    def prune_tree(tree, validation_data):
        # 간단한 예시: validation 데이터에 대한 정확도가 낮아지는 경우 가지 제거
        if isinstance(tree, dict):
            for feature in tree:
                for value in tree[feature]:
                    if isinstance(tree[feature][value], dict):
                        original_tree = copy.deepcopy(tree[feature][value])
                        tree[feature][value] = {'class': get_most_common_class(validation_data['target'])}
                        accuracy_after_pruning = calculate_accuracy(tree, validation_data)
                        accuracy_before_pruning = calculate_accuracy(original_tree, validation_data)
    
                        if accuracy_after_pruning < accuracy_before_pruning:
                            tree[feature][value] = original_tree  # 가지치기 취소
    
        return tree

💡 결정 트리의 장단점

  • 장점

    • 이해하기 쉬움 (Easy to Understand): 트리 구조는 시각적으로 표현하기 용이하며, 모델의 작동 방식을 직관적으로 이해할 수 있다.
    • 데이터 전처리 용이 (Easy Data Preprocessing): 수치형 데이터와 범주형 데이터를 모두 처리할 수 있으며, 결측치(missing values)에 대한 처리가 비교적 간단하다.
    • 비모수적 방법 (Non-parametric Method): 데이터 분포에 대한 가정이 필요 없으므로, 다양한 데이터에 적용 가능하다.
  • 단점

    • 과적합 가능성 (Overfitting): 트리가 너무 깊어지면 학습 데이터에 과적합될 가능성이 있다. 이를 방지하기 위해 가지치기 등의 기법이 필요하다.
    • 불안정성 (Instability): 데이터의 작은 변화에도 트리의 구조가 크게 변할 수 있다.
    • 선형 분리 불가능 문제 (Non-linear Separability): 데이터가 선형적으로 분리되지 않는 경우 성능이 떨어질 수 있다.

🎯 활용 예시

  • 의료 분야 (Medical Field): 환자의 증상을 기반으로 질병을 진단하거나, 환자의 특성을 기반으로 치료 방법을 결정하는 데 사용된다.
  • 금융 분야 (Financial Field): 고객의 신용 평가를 수행하거나, 사기 거래를 탐지하는 데 사용된다.
  • 마케팅 분야 (Marketing Field): 고객의 구매 패턴을 분석하여 맞춤형 광고를 제공하거나, 고객 이탈을 예측하는 데 사용된다.

📝 요약
결정 트리는 이해하기 쉽고 다양한 분야에서 활용 가능한 머신러닝 알고리즘이다. 정보 획득, 지니 불순도, 엔트로피 등의 기준을 사용하여 데이터를 분할하고, 트리의 복잡도를 줄이기 위해 가지치기를 수행한다. 과적합을 방지하고 일반화 성능을 향상시키는 것이 중요하다.

  • 결정 트리 (Decision Tree): 의사 결정을 위한 규칙을 트리 형태로 표현하는 모델
  • 정보 획득 (Information Gain): 특정 특징으로 데이터를 분할했을 때 얻는 정보량
  • 지니 불순도 (Gini Impurity): 데이터 집합의 불순도를 측정하는 지표
  • 엔트로피 (Entropy): 데이터 집합의 무질서도를 측정하는 지표
  • 가지치기 (Pruning): 트리의 복잡도를 줄이고 과적합을 방지하는 기법
반응형