여러가지공부/머신러닝(Machine Learning)

정보이득이란? 지니불순도, 엔트로피, 분류오차 예제 풀이, 파이썬 코드 풀이(Information Gain, Gini Impurity, Entrophy, Classification Error)#2

끄적끄적아무거나 2023. 5. 24. 08:55
반응형

 

목차

     

     

     

     

    엔트로피를 사용해서 정보이득 풀이 및 파이썬 검증

     

    앞서 포스트에서 정보이득(Information Gain)과 지니 불순도(Gini Impurity)를 사용해서 정보 이득을 구하는 방법에 대해 알아보았습니다(https://scribblinganything.tistory.com/719).

     

     

    이번 포스트는 엔트로피(Entrophy)와 분류오차(Classification Error)를 사용해서 정보이득을 구하는 방법에 대해 알아보겠습니다. 우선 엔트로피 입니다.

     

    정보 이론에서는 엔트로피를 확률 분포의 함수로 정의합니다. 엔트로피는 주어진 확률 분포에서 발생할 수 있는 모든 사건의 가능성을 고려하여 평균적으로 필요한 정보의 양을 측정합니다. 불확실성이 높을수록 엔트로피는 큰 값을 가지며, 불확실성이 낮을수록 엔트로피는 작은 값을 가집니다.

     

    예를 들어, 동전을 던져서 앞면이 나올 확률이 0.5이고 뒷면이 나올 확률도 0.5라고 가정해보겠습니다. 이 경우 동전의 엔트로피는 최대로 불확실한 상태로, 앞면과 뒷면이 나올 확률이 동일하기 때문에 1의 값을 가집니다. 그러나 동전의 앞면이 나올 확률이 1이고 뒷면이 나올 확률이 0이라면, 동전의 엔트로피는 최소로 불확실한 상태로, 0의 값을 가지게 됩니다.

     

    정보 이론에서 엔트로피는 정보의 압축 가능성과 관련이 있습니다. 엔트로피가 높을수록 메시지는 더 많은 정보를 담고 있으며, 따라서 압축하기 어렵습니다. 엔트로피가 낮을수록 메시지는 더 예측 가능하며, 압축하기 쉬워집니다.

     

    따라서, 정보 이득(information gain)은 엔트로피의 변화량을 나타내며, 어떤 분할 또는 선택으로 인해 얻는 정보의 양을 측정하는 데에 사용됩니다. 정보 이득은 엔트로피의 초기값과 분할 후의 엔트로피 값의 차이로 계산되며, 정보 이득이 크다는 것은 분할 또는 선택으로 인해 불확실성이 크게 감소했다는 것을 의미합니다.

     

     

     

    수식1

     

    • p(i|t): 특정 노트 t에서 클래스 i에 속한 샘플의 비율

     

     

     

    예제 수식 풀이>>

    그림1

     

    그림1의 이진 결정 트리(Binary Decision Tree)를 사용해서 풀어보겠습니다. 

     

     

     

    Entrophy of parent node = -0.5 * (-1) - 0.5 * (-1) = 1

     

    Entrophy of Left Leaf Node:

    p = 40 / (40 + 10) = 0.8

    q = 10 / (40 + 10) = 0.2

     

    Entrophy  (left leaf) = -0.8 * log2(0.8) - 0.2 * log2(0.2) ≈ 0.72

     

     

    Entrophy of Right Leaf Node:

    p = 10 / (10 + 40) = 0.2

    q = 40 / (10 + 40) = 0.8

     

    Entrophy (right leaf) = -0.8 * log2(0.8) - 0.2 * log2(0.2) ≈ 0.72

     

     

     

    Information Gain = Initial Impurity - Weighted Average Impurity = 1 - ((50/100) * 0.72 + (50/100) * 0.72) = 0.28

     

     

    정보 이득은 0.28이 나왔습니다. 파이썬(Python) 코드로 검증을 해보겠습니다.

     

    파이썬 코드 실습>>

    import math
    
    def entropy(p):
        if p == 0 or p == 1:
            return 0
        else:
            return -p * math.log2(p) - (1 - p) * math.log2(1 - p)
    
    def information_gain(parent, left_child, right_child):
        parent_entropy = entropy(parent[0] / sum(parent))
        left_entropy = entropy(left_child[0] / sum(left_child))
        right_entropy = entropy(right_child[0] / sum(right_child))
        
        weighted_average_entropy = (sum(left_child) / sum(parent)) * left_entropy + (sum(right_child) / sum(parent)) * right_entropy
        
        return parent_entropy - weighted_average_entropy
    
    # Example values
    parent_node = [50, 50]
    left_child_node = [40, 10]
    right_child_node = [10, 40]
    
    # Calculate information gain
    gain = information_gain(parent_node, left_child_node, right_child_node)
    print(f"Information Gain: {gain}")

     

     

    결과>>

    Information Gain: 0.2780719051126377

     

     

    파이썬 코드 다운로드>>

    entrophy.py
    0.00MB

     

     

     

     

     

     

     

     

    분류오차를 사용해서 정보이득 풀이 및 파이썬 검증

     

    정보이득에서 분류오차(classification error)는 머신러닝 분류 문제에서 사용되는 성능 지표 중 하나입니다. 분류오차는 잘못 분류된 샘플의 비율을 나타냅니다. 분류 모델은 입력 데이터를 여러 클래스 또는 범주로 분류하는데, 분류오차는 이 과정에서 실제 클래스와 예측 클래스가 일치하지 않는 경우를 측정합니다.

     

    분류오차는 일반적으로 다음과 같은 방식으로 계산됩니다. 모델이 N개의 샘플을 분류하고, 그 중 M개의 샘플이 잘못 분류되었다고 가정해봅시다. 이때 분류오차는 M/N으로 계산됩니다. 분류오차가 작을수록 모델의 성능이 좋다고 해석할 수 있습니다. 분류오차는 다른 성능 지표인 정확도(accuracy)와는 반대로 작을수록 좋은 값입니다.

     

    분류오차 외에도 다른 성능 지표들이 있으며, 모델의 특성과 목표에 따라 적절한 성능 지표를 선택해야 합니다. 일반적으로 분류 문제에서는 정확도, 정밀도, 재현율, F1 점수 등의 성능 지표가 함께 고려되며, 분류오차도 이러한 지표 중 하나입니다.

     

     

     

     

    수식2

     

    • p(i|t): 특정 노트 t에서 클래스 i에 속한 샘플의 비율

     

     

     

     

    예제 수식 풀이>>

    그림1

     

    그림1의 이진 결정 트리(Binary Decision Tree)를 사용해서 풀어보겠습니다. 

     

     

     

     

    Classification Error of parent node = 1 - 50/100 = 0.5

     

    Classification Error of Left Leaf Node:

    1- 40/50 = 0.2

     

     

     

    Classification Error of Right Leaf Node:

    1- 40/50 = 0.2

     

     

     

     

    Information Gain = Initial Impurity - Weighted Average Impurity = 0.5 - ((50/100) * 0.2 + (50/100) * 0.2) = 0.3

     

     

    정보 이득은 0.28이 나왔습니다. 파이썬(Python) 코드로 검증을 해보겠습니다.

     

    파이썬 코드 실습>>

    import math
    
    # Function to calculate classification error
    def classification_error(pos_samples, neg_samples, total_samples):
        error = min(pos_samples, neg_samples) / total_samples
        return error
    
    # Function to calculate information gain using classification error
    def information_gain_classification_error(pos_samples_parent, neg_samples_parent, pos_samples_left, neg_samples_left, pos_samples_right, neg_samples_right):
        total_samples_parent = pos_samples_parent + neg_samples_parent
        total_samples_left = pos_samples_left + neg_samples_left
        total_samples_right = pos_samples_right + neg_samples_right
        
        error_parent = classification_error(pos_samples_parent, neg_samples_parent, total_samples_parent)
        error_left = classification_error(pos_samples_left, neg_samples_left, total_samples_left)
        error_right = classification_error(pos_samples_right, neg_samples_right, total_samples_right)
        
        error_split = (total_samples_left / total_samples_parent) * error_left + (total_samples_right / total_samples_parent) * error_right
        
        information_gain = error_parent - error_split
        
        return information_gain
    
    # Example usage
    pos_samples_parent = 50
    neg_samples_parent = 50
    pos_samples_left = 40
    neg_samples_left = 10
    pos_samples_right = 10
    neg_samples_right = 40
    
    ig = information_gain_classification_error(pos_samples_parent, neg_samples_parent, pos_samples_left, neg_samples_left, pos_samples_right, neg_samples_right)
    print("Information Gain using classification error:", ig)

     

     

    결과>>

    Information Gain using classification error: 0.3

     

     

    파이썬 코드 다운로드>>

    ce.py
    0.00MB

    반응형