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

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

끄적끄적아무거나 2023. 5. 23. 10:01
반응형

 

 

 

정보이득이란(Information Gain)?

 

정보 이득(Information Gain)은 정보 이론과 머신 러닝에서 사용되는 개념으로, 주어진 속성이나 특성을 기준으로 데이터를 분할할 때 얻을 수 있는 정보의 양을 측정하는 지표입니다. 정보 이득은 데이터 분할 전후의 불확실성 감소량을 측정하여 해당 속성이나 특성이 분류 작업에 얼마나 유용한지를 평가하는 데 사용됩니다.

 

정보 이득은 지니불순도, 엔트로피, 분류오차(Gini Impurity, Entrophy, Classification Error)라고 불리는 개념을 기반으로 계산됩니다. 엔트로피는 주어진 데이터 집합의 혼잡도나 불확실성을 나타내는 지표로, 값이 작을수록 데이터가 분류되어 정돈되어 있다는 의미를 가지고 있습니다. 따라서 정보 이득은 주어진 속성이나 특성을 사용하여 데이터를 분할했을 때, 분할 전후의 엔트로피 감소량을 계산하여 얻을 수 있는 정보의 양을 측정합니다.

 

정보 이득은 의사 결정 트리(Decision Tree) 알고리즘에서 특히 중요한 개념으로 사용됩니다. 의사 결정 트리는 데이터를 분할하는 데에 정보 이득을 최대화하는 속성을 선택하여 트리를 구성하게 됩니다. 이를 통해 데이터를 가장 효과적으로 분류하고 예측할 수 있는 의사 결정 규칙을 찾을 수 있습니다.

 

간단히 말하면, 정보 이득은 데이터 분할 전후의 불확실성 감소를 측정하여 주어진 속성이나 특성이 분류 작업에 얼마나 유용한지를 평가하는 지표입니다.

 

 

수식1

  • IG : 정보이득
  • Dp, Np : 부모 노드 샘플, 샘플 개수
  • Dj, Nj : 자식 노드 샘플, 샘플 개수
  • I : 불순도

 

수식1은 정보 이득을 표현하는 수식입니다. 이를 이진 결정 트리(Binary Decision Tree)에서 표기 하면 아래와 같이 간단하게 정리 됩니다.

 

수식2

 

 

부모노드의 불순도(Impurity)는 결정되었다고 가정한다면 자식노드의 불순도가 작아질 수록 정보이득(Information Gain)이 커집니다. 그리고 불순도를 계산하기 위해서 사용하는 방법이 지니불순도, 엔트로피, 분류오차(Gini Impurity, Entrophy, Classification Error)입니다.

 

 

아래 부터는 각 불순도 방식에 대한 수식 및 설명을 예제를 통해서 제공합니다. 그리고 파이썬(Python)으로 검증을 해보겠습니다. 예제에 사용할 트리는 아래와 같은 이진결정트리(Binary Dicision Tree)입니다.

 

 

그림1

 

 

 

 

지니불순도를 사용해서 정보이득 풀이 및 파이썬 검증

 

지니 불순도는 분류 작업에서 노드의 불순도를 측정하는 지표입니다. 지니 불순도는 0부터 1까지의 값을 가지며, 0에 가까울수록 해당 노드의 순도가 높다는 것을 의미합니다.

 

간단하게 설명하면, 지니 불순도는 노드에 속한 데이터의 클래스 분포를 기반으로 계산됩니다. 예를 들어, 노드에 속한 데이터가 한 클래스로 완전히 구성되어 있다면 (순수한 노드), 지니 불순도는 0이 됩니다. 반대로, 노드에 속한 데이터가 여러 클래스로 고르게 섞여 있다면 (불순한 노드), 지니 불순도는 1에 가까워집니다.

 

이 지표를 사용하는 이유는 결정 트리가 데이터를 분할할 때, 지니 불순도를 최소화하는 방향으로 분할점을 선택하여 순수한 하위 노드를 만들기 위함입니다. 즉, 지니 불순도를 기준으로 가장 불순도가 낮은 특성과 임계값을 선택하여 데이터를 나누는 과정을 반복하면서 결정 트리를 구성합니다.

 

따라서, 지니 불순도를 사용하면 결정 트리는 데이터를 가장 잘 구분하는 특성과 임계값을 찾아내어 각 노드의 순도를 최대화하는 분류 모델을 생성할 수 있습니다.

 

 

수식3

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

 

 

예제 수식 풀이>>

 

그림1

 

 

위 수식3을 사용해서 그림1의 예제의 정보 이득을 구해보겠습니다. 

 

 

Gini impurity of parent node = 1 - (0.5^2 + 0.5^2) = 0.5

 

Impurity of Left Leaf Node:

p = 40 / (40 + 10) = 0.8

q = 10 / (40 + 10) = 0.2

 

Gini impurity (left leaf) = 1 - (0.8^2 + 0.2^2) = 0.32

 

 

Impurity of Right Leaf Node:

p = 10 / (10 + 40) = 0.2

q = 40 / (10 + 40) = 0.8

 

Gini impurity (right leaf) = 1 - (0.2^2 + 0.8^2) = 0.32

 

 

 

Information Gain = Initial Impurity - Weighted Average Impurity

 

0.5 - (50 / 100) * 0.32 + (50 / 100) * 0.32  = 0.18

 

 

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

 

 

파이썬 코드 실습>>

# Function to calculate Gini impurity
def calculate_gini_impurity(p, q):
    return 1 - (p**2 + q**2)

# Function to calculate information gain using Gini impurity
def calculate_information_gain(parent_node, child_nodes):
    parent_p = parent_node[0] / sum(parent_node)
    parent_q = parent_node[1] / sum(parent_node)
    parent_gini = calculate_gini_impurity(parent_p, parent_q)
    
    weighted_sum = 0
    for child_node in child_nodes:
        child_p = child_node[0] / sum(child_node)
        child_q = child_node[1] / sum(child_node)
        child_gini = calculate_gini_impurity(child_p, child_q)
        weighted_sum += (sum(child_node) / sum(parent_node)) * child_gini
    
    information_gain = parent_gini - weighted_sum
    return information_gain

# Main code
parent_node = [50, 50]
child_nodes = [[40, 10], [10, 40]]

information_gain = calculate_information_gain(parent_node, child_nodes)
print("Information Gain using Gini impurity:", information_gain)

 

결과>>

Information Gain using Gini impurity: 0.18000000000000016

 

 

 

파이썬 코드 다운로드>>

 

gini.py
0.00MB

 

 

 

 

다음 포스트에서 엔트로피와 분류오차 방식으로 정보 이득을 구하는 실습을 진행해보겠습니다.

반응형