정보 이득(Information Gain) 쉽게 이해하기
정보 이득은 머신러닝, 특히 의사 결정 트리(Decision Tree) 알고리즘에서 중요한 개념입니다. 이 글에서는 정보 이득의 정의, 계산 방법, 그리고 실제 사용 예시를 통해 정보 이득을 쉽게 이해할 수 있도록 돕겠습니다. 정보 이득을 통해 의사 결정 트리가 어떤 기준으로 데이터를 분할하는지 알아보고, 정보 이득의 한계점과 이를 극복하기 위한 방법도 함께 살펴보겠습니다.
🤔 정보 이득이란? (What is Information Gain?)
정보 이득(Information Gain)은 특정 속성(feature)을 사용해 데이터를 분할했을 때 얻게 되는 정보량의 변화를 의미합니다. 정보 이득은 어떤 속성이 분류 문제에서 얼마나 중요한 역할을 하는지 평가하는 데 사용됩니다. 즉, 어떤 속성을 기준으로 데이터를 나누는 것이 분류 정확도를 높이는 데 가장 효과적인지를 판단하는 지표입니다. 정보 이득이 높을수록 해당 속성이 분류에 미치는 영향이 크다고 볼 수 있습니다.
정보 이득은 엔트로피(Entropy)라는 개념을 기반으로 계산됩니다. 엔트로피는 데이터 집합의 불확실성 또는 무질서도를 나타냅니다. 엔트로피가 높을수록 데이터가 혼란스럽고, 낮을수록 데이터가 잘 정돈되어 있다고 할 수 있습니다. 정보 이득은 속성을 사용해 데이터를 분할한 후 엔트로피가 얼마나 감소했는지를 측정합니다.
🧮 정보 이득 계산 방법 (How to Calculate Information Gain)
정보 이득을 계산하려면 먼저 엔트로피를 계산해야 합니다. 엔트로피는 다음과 같은 식으로 정의됩니다.
Entropy(S) = - Σ p(i) * log2(p(i))
여기서 S는 데이터 집합, p(i)는 S에서 클래스 i에 속하는 데이터의 비율을 의미합니다. 예를 들어, 데이터 집합 S에 양성(Positive) 클래스 6개와 음성(Negative) 클래스 4개가 있다면, 엔트로피는 다음과 같이 계산됩니다.
Entropy(S) = - (6/10) * log2(6/10) - (4/10) * log2(4/10) ≈ 0.971
정보 이득은 다음과 같은 식으로 계산됩니다.
InformationGain(S, A) = Entropy(S) - Σ (|Sv| / |S|) * Entropy(Sv)
여기서 S는 데이터 집합, A는 속성, Sv는 속성 A의 값 v에 해당하는 데이터 집합, |Sv|는 Sv의 크기, |S|는 S의 크기를 의미합니다. 즉, 정보 이득은 전체 데이터 집합의 엔트로피에서 속성 A로 분할된 각 부분 집합의 엔트로피의 가중 평균을 뺀 값입니다.
예를 들어, 다음과 같은 데이터 집합이 있다고 가정해 보겠습니다.
날씨 | 온도 | 습도 | 바람 | 운동 |
---|---|---|---|---|
맑음 | 높음 | 높음 | 약함 | X |
맑음 | 높음 | 높음 | 강함 | X |
흐림 | 높음 | 높음 | 약함 | O |
비 | 낮음 | 높음 | 약함 | O |
비 | 낮음 | 낮음 | 약함 | O |
비 | 낮음 | 낮음 | 강함 | X |
흐림 | 낮음 | 낮음 | 강함 | O |
맑음 | 높음 | 낮음 | 약함 | O |
맑음 | 낮음 | 높음 | 약함 | O |
비 | 높음 | 높음 | 약함 | X |
이 데이터 집합에서 운동 여부(O/X)를 예측하는 의사 결정 트리를 만들 때, 어떤 속성을 먼저 선택해야 할까요? 정보 이득을 사용하여 각 속성의 중요도를 평가할 수 있습니다.
- 전체 데이터 집합의 엔트로피를 계산합니다. 운동 여부가 O인 경우는 5개, X인 경우는 5개이므로, 엔트로피는 다음과 같습니다.
Entropy(S) = - (5/10) * log2(5/10) - (5/10) * log2(5/10) = 1
- 각 속성에 대해 정보 이득을 계산합니다. 예를 들어, 날씨 속성에 대한 정보 이득을 계산해 보겠습니다. 날씨 속성은 맑음, 흐림, 비 세 가지 값을 가질 수 있습니다.
- 날씨 = 맑음: 운동 = O (2개), 운동 = X (2개)
- 날씨 = 흐림: 운동 = O (2개), 운동 = X (0개)
- 날씨 = 비: 운동 = O (1개), 운동 = X (3개)
날씨 속성을 사용한 정보 이득은 다음과 같이 계산됩니다.InformationGain(S, 날씨) = Entropy(S) - [(4/10) * Entropy(날씨=맑음) + (2/10) * Entropy(날씨=흐림) + (4/10) * Entropy(날씨=비)] Entropy(날씨=맑음) = - (2/4) * log2(2/4) - (2/4) * log2(2/4) = 1 Entropy(날씨=흐림) = - (2/2) * log2(2/2) - (0/2) * log2(0/2) = 0 Entropy(날씨=비) = - (1/4) * log2(1/4) - (3/4) * log2(3/4) ≈ 0.811 InformationGain(S, 날씨) = 1 - [(4/10) * 1 + (2/10) * 0 + (4/10) * 0.811] ≈ 0.176
- 다른 속성(온도, 습도, 바람)에 대해서도 동일한 방식으로 정보 이득을 계산합니다.
- 정보 이득이 가장 높은 속성을 첫 번째 분할 기준으로 선택합니다.
🌳 의사 결정 트리에서의 활용 (Use in Decision Tree)
의사 결정 트리(Decision Tree)는 정보 이득을 활용해 데이터를 분류하는 대표적인 알고리즘입니다. 의사 결정 트리는 루트 노드(Root Node)에서 시작해 정보 이득이 가장 높은 속성을 기준으로 데이터를 분할합니다. 각 분할된 데이터 집합에 대해 다시 정보 이득을 계산하고, 가장 높은 속성을 기준으로 다시 분할하는 과정을 반복합니다. 이 과정을 더 이상 분할할 수 없거나, 특정 조건(예: 최대 깊이)을 만족할 때까지 반복합니다.
의사 결정 트리는 직관적이고 이해하기 쉬운 모델이지만, 과적합(Overfitting) 문제가 발생할 수 있습니다. 과적합은 모델이 학습 데이터에 너무 맞춰져서 실제 데이터에 대한 예측 성능이 떨어지는 현상을 의미합니다. 과적합을 방지하기 위해 트리의 깊이를 제한하거나, 가지치기(Pruning) 등의 방법을 사용할 수 있습니다.
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import pandas as pd
# 가상의 데이터 생성
data = {'날씨': ['맑음', '맑음', '흐림', '비', '비', '비', '흐림', '맑음', '맑음', '비'],
'온도': ['높음', '높음', '높음', '낮음', '낮음', '낮음', '낮음', '높음', '낮음', '높음'],
'습도': ['높음', '높음', '높음', '높음', '낮음', '낮음', '낮음', '낮음', '높음', '높음'],
'바람': ['약함', '강함', '약함', '약함', '약함', '강함', '강함', '약함', '약함', '약함'],
'운동': ['X', 'X', 'O', 'O', 'O', 'X', 'O', 'O', 'O', 'X']}
df = pd.DataFrame(data)
# 범주형 데이터를 숫자형으로 변환
df['날씨'] = df['날씨'].map({'맑음': 0, '흐림': 1, '비': 2})
df['온도'] = df['온도'].map({'높음': 0, '낮음': 1})
df['습도'] = df['습도'].map({'높음': 0, '낮음': 1})
df['바람'] = df['바람'].map({'약함': 0, '강함': 1})
df['운동'] = df['운동'].map({'X': 0, 'O': 1})
# 특징(features)과 타겟(target) 분리
X = df[['날씨', '온도', '습도', '바람']]
y = df['운동']
# 학습 데이터와 테스트 데이터 분리
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 의사 결정 트리 모델 생성 및 학습
model = DecisionTreeClassifier(random_state=42)
model.fit(X_train, y_train)
# 테스트 데이터로 예측
y_pred = model.predict(X_test)
# 정확도 평가
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy}')
⚠️ 정보 이득의 한계와 극복 방법 (Limitations of Information Gain)
정보 이득은 속성의 값 종류가 많을수록 높은 값을 가지는 경향이 있습니다. 예를 들어, 사용자 ID와 같이 고유한 값이 많은 속성은 정보 이득이 매우 높게 계산될 수 있습니다. 이는 의사 결정 트리가 과적합되는 원인이 될 수 있습니다.
이러한 문제를 해결하기 위해 정보 이득 비율(Information Gain Ratio)을 사용할 수 있습니다. 정보 이득 비율은 정보 이득을 속성의 고유한 값의 수에 대한 정보량으로 정규화한 값입니다. 정보 이득 비율은 다음과 같이 계산됩니다.
GainRatio(S, A) = InformationGain(S, A) / SplitInformation(S, A)
여기서 SplitInformation(S, A)는 속성 A의 분할 정보량으로, 다음과 같이 계산됩니다.
SplitInformation(S, A) = - Σ (|Sv| / |S|) * log2(|Sv| / |S|)
정보 이득 비율은 속성의 값 종류가 많을수록 분할 정보량이 증가하므로, 정보 이득이 과대평가되는 문제를 완화할 수 있습니다.
🚀 결론 (Conclusion)
정보 이득은 의사 결정 트리 알고리즘에서 중요한 역할을 하는 개념입니다. 정보 이득을 통해 어떤 속성이 분류 문제에서 얼마나 중요한 역할을 하는지 평가하고, 데이터를 효율적으로 분할할 수 있습니다. 정보 이득의 한계를 극복하기 위해 정보 이득 비율과 같은 방법을 사용할 수 있습니다. 정보 이득을 이해하고 활용하면 더 정확하고 효율적인 머신러닝 모델을 구축할 수 있습니다.
📝 핵심 용어 정리 (Key Terms)
- 정보 이득 (Information Gain): 속성을 사용해 데이터를 분할했을 때 얻게 되는 정보량의 변화.
- 엔트로피 (Entropy): 데이터 집합의 불확실성 또는 무질서도.
- 의사 결정 트리 (Decision Tree): 정보 이득을 활용해 데이터를 분류하는 알고리즘.
- 과적합 (Overfitting): 모델이 학습 데이터에 너무 맞춰져서 실제 데이터에 대한 예측 성능이 떨어지는 현상.
- 정보 이득 비율 (Information Gain Ratio): 정보 이득을 속성의 고유한 값의 수에 대한 정보량으로 정규화한 값.
- 분할 정보량 (Split Information): 속성 A의 분할 정보량.