엔트로피와 정보획득(Entropy & Infomation Gain)
정보와 엔트로피(Infomation & Entropy)
정보의 기본개념은 이벤트, 확률변수, 분포와 같은 항목에서 정보의 양을 정량화하는 것으로 확률을 사용합니다. 직관적으로 정보를 정량화레 대한 기본 아이디어는 대상 이벤트에 대한 불확실성(uncertainty)을 측정한다는 것입니다.
드문 이벤트은 발생할 확률이 낮으므로 불확실성이 증가합니다. 불확실성을 감소시키기 위해 많은 정보가 필요합니다. 매우 다양한 정보량의 높은 정보를 가집니다. 예를 들어 여러 샘플이 포함된 박스에서 특정한 샘플을 선택하는 사건에서 낮은 확률은 샘플의 종류가 많은 경우일 것입니다. 이러한 상황은 데이터의 impurity가 높은 상황입니다. 이것을 엔트로피(entropy)로 나타냅니다. 반대의 상황, 높은 확률,은 낮은 엔트로피를 보입니다. 정리하면 다음과 같이 나타낼 수 있습니다.
- 낮은 확률 이벤트 : 높은 정보(놀라움)
- 높은 확률 이벤트 : 낮은 정보(놀랍지 않음)
사건(x)의 확률(p(x))로 부터 정보(info(x))를 정량화하기 위해 식 1과 같이 계산합니다.
$$\tag{식 1}\text{Info}(x)=h(x) = -\log(p(x))$$
결국 정보는 이벤트 설명에 필요한 메모리 수로 간주할 수 있습니다. 그러므로 식 1에서 2진법(bit 수)으로 나타내기 위해 log 2를 사용할 수 있지만 정보의 절대량보다는 그 변화가 더 중요하므로 일반적으로 자연로그를 사용합니다.
식 1에서 p(x)가 낮을수록 정보(h)는 증가함을 알 수 있습니다.
사건의 확률 1 → h=0
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns sns.set_style("darkgrid")
다음 코드는 동전 던지기에서 앞면이 나올 확률 p=0.5인 경우 정보 h=1임을 계산한 것입니다.
p=0.5 h=-np.log(p); h
0.6931471805599453
주사위 던지기의 경우는 각 수의 확률은 1/6이며 이 확률은 동전던지기 보다 낮으므로 정보는 높습니다. 즉, 이 사건에 대해 나타내기 위해 더 많은 정보가 필요합니다.
p=1/6 h=-np.log(p); h
1.791759469228055
확률에 따른 정보의 변화를 시각적으로 나타내봅니다.
p=np.arange(0.01, 1, 0.1) h=-np.log2(p) plt.figure(figsize=(4,3)) plt.plot(p, h, 'o-') plt.xlabel("Probability") plt.ylabel("Information") plt.show()
확률변수의 엔트로피 계산
확률변수들이 가진 정보를 정량화할 수 있습니다. 이 계산을 정보엔트로피, 간단하게 엔트로피라 합니다. 이 엔트로피는 해당분포에서 추출한 이벤트의 기대 정보량입니다. 그러므로 식 2와 같이 각 이벤트의 엔트로피들의 평균 즉, 기대값이 대상 분포의 에트로피가 됩니다.
\begin{align}H(X)&=-\sum^n_{k=1}p(k)\log_2(p(k))\\\tag{식 2}n:&\,\text{클래스의 수} \\p(k):&\,\text{클래스 k의 확률} \end{align}
다음은 동전던지기 2번, 주사위 6번을 시행한 경우를 계산한 것입니다.
n1=2 p1=1/2 ent1=-np.sum([p1*np.log(p1) for _ in range(n1)]) ent1
0.6931471805599453
n2=6 p2=1/6 ent1=-np.sum([p2*np.log(p2) for _ in range(n2)]) ent1
1.7917594692280547
데이터 셋의 각 샘플의 확률을 알수 있는 경우 scipy.stats.entropy()
메서드를 사용하여 엔트로피를 계산할 수 있습니다.
from scipy.stats import entropy
p=np.repeat(1/6, 6) ety=entropy(p) ety
1.791759469228055
엔트로피는 확률이 낮을 수록 높습니다. 즉, 불확실성이 증가할수록 엔트로피는 증가합니다. 다음 그림은 이 관계를 나타내기 위해 확률의 변화에 따른 엔트로피의 변화를 나타낸 것입니다.
def entropyCal(events, ets=1e-15): return(-np.sum([p*np.log(p+ets) for p in events])) probs=np.arange(0.0, 0.6, 0.1) dist=np.array([[p, 1.0-p] for p in probs]) etys=np.array([entropyCal(d) for d in dist]) plt.figure(figsize=(6, 3)) plt.plot(probs, etys, marker=".") plt.xticks(probs, [str(d) for d in dist]) plt.xlabel("Change of Probs") plt.ylabel("Entropy") plt.show()
위 그림은 모든 샘플의 확률이 동일할 경우 가장 높은 엔트로피를 나타냅니다. 반면에 불확실성이 가장 높은(확률=0) 경우와 가장낮은(확률=1) 경우가 포함된 분포에서 최저의 엔트로피를 보입니다. 그러므로 왜곡된 분포의 엔트로피는 균일 분포에서의 엔트로피보다 낮습니다.
정보획득(Ingformation Gain)
정보획득은 정보를 획득함으로서 감소되는 불확실성을 계산하는 것입니다. 주로 결정트리(decision tree)등의 분류 알고리즘에 사용됩니다. 또한 대상 변수의 이득을 평가하여 그 결과로 특징(feature)를 선택하는 과정에 사용됩니다. 특히 특징의 선택에 사용되는 정보획득을 상호정보(mutual information)이라 합니다.
IG(정보획득)은 식 3과 같이 데이터 세트를 분할함으로써 엔트로피의 감소를 측정하는 것입니다.
\begin{align}\tag{식 3}\text{IG}&=\text{entropy of parent}-\sum^n_i \text{weight}\cdot \text{entropy of child}_i\\ &\text{weight}=\frac{\text{size of child}_i}{\text{size of parent}}\end{align}
다음은 데이터 y를 두그룹으로 분할 한 경우 정보획득(information gain)을 계산한 것입니다.
rndGen=np.random.RandomState(9) y=rndGen.choice([0, 1], 20) y
array([0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1])
def probCal(x): tot=len(x) uni, cnt=np.unique(x, return_counts=True) re=pd.DataFrame(cnt/tot, columns=["Probability"]) return(re)
prob_y=probCal(y) prob_y
Probability | |
---|---|
0 | 0.55 |
1 | 0.45 |
ety_y=entropy(prob_y); ety_y
array([0.68813881])
위 데이터 y를 두 그룹으로 분류하면 다음과 같습니다.
g1=np.array([0,0,0,0,0,0,0,1]) g2=np.array([0,0,0,0, 1,1,1,1,1,1,1, 1])
ety_g1=entropy(probCal(g1)) ety_g2=entropy(probCal(g2)) print(f"entropy of calss1={ety_g1}\nentropy of calss2={ety_g2}")
entropy of calss1=[0.37677016] entropy of calss2=[0.63651417]
위 분할된 두 그룹의 엔트로피는 각각의 기대값입니다.
ety_level2=len(g1)/len(y)*ety_g1+len(g2)/len(y)*ety_g2 ety_level2
array([0.53261657])
ig=ety_y-ety_level2 ig
array([0.15552225])
즉, 두 그룹으로 분할후 엔트로피는 감소했습니다. 이것은 불확실성이 감소한 것으로 분할후 확률이 높아짐을 나타냅니다. 결과적으로 동종들 끼리의 모둠 현상이 개선됨을 나타냅니다.
댓글
댓글 쓰기