Mining – 의사결정나무 中 엔트로피

여러 모양이 섞여 있는 집합에서 특징 별로 구분해서 같은 종류의 도형만 남게 해봅시다.
우리는 아래와 같은 ‘의사결정나무’를 이용합니다.

‘의사결정나무’의 규칙은 한 단계 거쳤을 때마다 좀 더 정리되게 집합을 나눠야 하는 것입니다.
이를 컴퓨터로 처리하고 싶은데 컴퓨터는 정리라는게 무엇인지 모릅니다.

그렇기에 ‘정리’라는 단어말고 컴퓨터가 처리할 수 있는 단어로 머신러닝 목표를 정해 봅시다!
이는 ‘컴퓨터에게 알려주는 학습 목표’를 정하는 것입니다.

‘머신러닝’을 이용하면 컴퓨터가 학습한 후, 다음에 비슷한 데이터가 와도 같은 방법으로 처리할 수 있습니다!

머신러닝 목표: 순도가 증가, 불순도 혹은 불확실성이 최대한 감소하도록 만들어!!

순도와 관련된 사실은 엔트로피와 지니지수를 이용할 수 있습니다.

엔트로피와 지니지수는 공식으로 나와 있으니 컴퓨터가 처리할 수 있겠죠?

엔트로피‘데이터가 얼마나 섞여 있는지를 나타내는 척도’입니다.
많이 섞여 있을 수록 엔트로피 값은 1에 가까워 집니다.
이 척도를 알면 무엇을 할 수 있을까요?

예시)
엔트로피 검사(A) -> 전체 집합을 선을 그어서 나눠보기 -> 엔트로피 검사(B) -> 다른 방법으로 선을 그어서 나눠보기 -> 엔트로피 검사(C)

위 예시에서는 엔트로피 검사를 총 3번합니다.
A보다 B가 엔트로피 값이 더 작고, B보다 C가 엔트로피 값이 작으면
(더 순도가 낮다 -> 정리가 잘됐다)고 볼 수 있지 않을까요?

말로만 하면 이해가 힘드니, 예시를 통해 엔트로피를 구해 봅시다!

Entropy(A)= – Sigma(k=1->m) { Pk*log2(Pk) }
Pk= A영역에서 k범주에 속하는 레코드의 비율
M= 범주의 개수
(레코드: 원소라고 생각, 범주: 원소의 종류<빨간 원소,파란 원소>라고 생각)

A: 전체
K=빨간 색 동그라미일 때
10/16log2(10/16)
K= 파란 색 동그라미일 때
6/16log2(6/16)


Entropy(A)= – { 10/16log2(10/16) + 6/16log2(6/16) }

이를 R 프로그래밍으로 확인해봅시다!

# 범주가 두 개일 때 엔트로피 값 구하기 
entropy=function(pk){
  return (- pk *log2(pk) - (1-pk)*log2(1-pk) )
}

entropy(10/16)

분할 후 엔트로피를 재검사하기 전에, 엔트로피의 특징도 한 번 알아 봅시다!

엔트로피의 특징

A영역에 속한 모든 레코드가 동일한 범주에 속할 경우 엔트로피가 0임
반대로 범주가 둘 뿐이고 레코드 수가 동일하게 반반씩 섞여 있을 경우 엔트로피는 최대임

이제 분할 후 엔트로피를 구해 봅시다!
분할 후 엔트로피를 계산할 때는 다른 공식을 이용합니다!

Ri-> (위는 i(1)영역이고 0.5, 아래는 i(2)영역이고 0.5)

Entropy(B)= Sigma(i=1->d) [ Ri * { (Sigma(k=1->m)Pk*Log2(Pk)) } ]
Ri= 분할 후 i영역에 속하는 레코드 수 / 전체 레코드 수
d= 영역의 개수

식이 어려워 보이지만 쉽게 생각합시다!
범주가 두 개니까 안쪽 시그마를 [ a(k:빨강)+b(k:파랑) ] 라고 표현할 수 있습니다!
영역이 두 개니까 바깥쪽 시그마는 [ R1+R2 ] 로 표현할 수 있겠네요!
그러면 R1*(-a-b) + R2*(-a-b)가 됩니다! < a,b값은 i에 따라 달라짐 >

{ 0.5 * (-1/8 * Log2(1/8) – 7/8 * Log2(7/8) ) } + { 0.5 * (-3/8 * Log2(3/8) – 5/8 * Log2(5/8) ) }
엔트로피 함수는 위에서 만들었으니 이렇게 풀 수 있습니다!
0.5 * entropy(1/8) + 0.5 * entropy(3/8)

이를 R 프로그래밍으로 확인해봅시다!

# 범주가 두 개일 때 엔트로피 값 구하기 
entropy=function(pk){
  return (- pk *log2(pk) - (1-pk)*log2(1-pk) )
}

# 영역이 두 개일 때 분할 후 엔트로피 값 구하기
entropy2=function(r1,pk1,pk2){
  # r1은 첫 번째 영역 레코드 비율
  # pk1은 첫 번째 영역에서 한 범주의 레코드 비율 
  # pk2은 두 번째 영역에서 한 범주의 레코드 비율 
  
  # pk1의 엔트로피
  one=entropy(pk1)
  # pk2의 엔트로피
  two=entropy(pk2)
  
  return(r1 * one + (1-r1) * two)
}

# 엔트로피 함수로 (분할 후 엔트로피) 풀기!
0.5 * entropy(1/8) + 0.5 * entropy(3/8)
# 엔트로피2 함수로 (분할 후 엔트로피) 풀기!
entropy2(0.5,1/8,3/8)

분할 하기 전 엔트로피: 0.95
분할 한 후 엔트로피: 0.74

엔트로피가 줄어들었으니 분할을 잘 했다고 볼 수 있습니다!

결국 정리를 잘한게 됩니다.

다음 포스팅에는 ‘지니지수’ 를 알아 보겠습니다!

Leave a Reply

Your email address will not be published. Required fields are marked *