경기도미래기술학교 AI개발자 부트캠프 29일차 TIL- Decision tree란? 엔트로피란? 개념 알고 실습하기.

2023. 6. 19. 18:35python

반응형

Decision tree를 배웠다.

Decision Tree(의사결정 트리)는 데이터를 분류하거나 예측하기 위한 지도 학습 알고리즘이다. 이 알고리즘은 트리 구조를 사용하여 데이터를 분할하고 판단 규칙을 만들어 내는 방식이다.

이 트리는 데이터의 특성을 기반으로 하여 노드(node)라고 불리는 분기점들을 생성하고, 노드는 특정한 조건을 통해 데이터를 분할한다. 분할은 정보 이득(information gain), 지니 불순도(gini impurity), 분산 감소(variance reduction) 등의 지표를 사용하여 이루어진다.

log 할 줄을 몰라서 좀 헤맸다. 밑이 있고 log를 어떻게 사용하는지 등을 몰랐다. 이제는 앎.

 

import numpy as np

# 로그를 계산할 값.
x = 10

# 자연로그 계산 (밑이 e)
result = np.log(x)
print("자연로그:", result)

Entropy에 대한 개념.

 

물리적 엔트로피는 열역학에서 사용되는 개념으로, 시스템의 무질서 정도를 측정하는 값이다.. 엔트로피가 높을수록 시스템은 더 큰 무질서 상태에 가깝다고 말할 수 있다. 엔트로피는 분자의 움직임, 에너지 분배, 입자의 배치 등 시스템의 상태에 따라 달라지는데 예를 들어, 고체 상태의 물질은 분자들이 잘 정렬되어 있어 엔트로피가 낮지만, 액체나 기체 상태로 변하면 분자들의 움직임이 자유로워져 엔트로피가 더 높아진다.

 

정보 이론에서 사용되는 엔트로피는 메시지나 데이터의 불확실성이나 예측 가능성을 나타내는 지표이다. 엔트로피가 높을수록 정보의 불확실성이 커지고, 엔트로피가 낮을수록 정보의 불확실성이 작아진다. 예를 들어, 동전을 한 번 던져서 앞면 또는 뒷면이 나올 때의 엔트로피는 가장 높다. 반면, 동전이 고정된 상태로 앞면만 나올 때의 엔트로피는 0에 가깝다.

둘 모두 불확실성이나무질서 관련된 개념이라는것이 공통점이여서 이 것을 생각하면 된다.  

 

# H = -Σ(p * log2(p))
#
# H: 엔트로피 (Entropy)
# p: 각 사건이 발생할 확률
# log2: 밑이 2인 로그 (정보량을 비트 단위로 표현하기 위함)

result1 = -12/12*np.log2(12/12)
print(result1)

result2 = (-9/12*np.log2(9/12))+(-3/12*np.log2(3/12))
print(result2)


result3 = (-6/12*np.log2(6/12))+(-6/12*np.log2(6/12))
print(result3)

result4 = (-6/12*np.log2(6/12))+(-3/12*np.log2(3/12))+(-3/12*np.log2(3/12))
print(result4)

result5 = (-4/12*np.log2(4/12))*3
print(result5)

result6 = (-1/12*np.log2(1/12))*12
print(result6)

엔트로피 공식에 대한 것을 잘 알고 계산하자.

 

가중치(Weight) : 각 데이터 포인트에 대한 중요도. 총 데이터 중에 몇 개가 들어가있는지를 계산한다.

 

rint('Weight Start')
print('--------------------------')
# 가중치 * 엔트로피
n1 = 2/10*1
n2 = 5/10*0.971
n3 = 3/10*0.919

print(n1+n2+n3)
#정보 획득량(information gain)
print('--------------------------')
print('Information Gain Start')
# 현재 노드의 엔트로피를 계산.
# 각 속성에 대해 분할 후의 엔트로피를 계산.
# 분할 후의 엔트로피의 가중 평균을 계산.
# 현재 노드의 엔트로피 - 가중 평균된 분할 후 엔트로피
#1. 엔트로피 구하기.

print('--suspicious start---')
suspicious = -3/6*np.log2(3/6)*2
print(suspicious)


spam_node = -3/3*np.log2(3/3)
print(spam_node)

#가중치 * 엔트로피
spam_weight_entropy = 3/6*spam_node

ham_node = -3/3*np.log2(3/3)
print(ham_node)

#가중치 * 엔트로피
ham_weight_entropy = 3/6*ham_node

#분기 이후 엔트로피
rem=ham_weight_entropy+spam_weight_entropy


information_gain = suspicious-rem

print(information_gain)


print('---Unknown Sender Start---')

unknown_sender = -3/6*np.log2(3/6)*2
print(unknown_sender)


spam_node = (-2/3*np.log2(2/3)) + (-1/3*np.log2(1/3))
print(spam_node)

#가중치 * 엔트로피
spam_weight_entropy = 3/6*spam_node

ham_node = (-1/3*np.log2(1/3)) + (-2/3*np.log2(2/3))
print(ham_node)

#가중치 * 엔트로피
ham_weight_entropy = 3/6*ham_node

#분기 이후 엔트로피
rem=ham_weight_entropy+spam_weight_entropy


information_gain = unknown_sender-rem

print('information_gain: ',information_gain)

 

728x90