Coding Diary.

(Machine Learning) 결정트리, 지니 불순도 (gini impurity) 본문

Coding/Machine Learning

(Machine Learning) 결정트리, 지니 불순도 (gini impurity)

life-of-nomad 2023. 10. 5. 09:19
728x90
반응형

1. 지니 불순도

머신 러닝 프로그램이 결정 트리를 만들 때는 과제처럼 내용이 정해져 있는 내용으로 만드는 게 아니라 경험을 통해 직접 정해나가야 합니다. 데이터를 분류해 보면서, 각 위치에서 어떤 노드가 제일 좋을지 고르는 것입니다.

 

선형 회귀 알고리즘의 목적이 학습 데이터를 가장 잘 나타낼 수 있는 일차식을 찾는 거였습니다. 결정 트리의 목적은 학습 데이터를 직접 분류해보면서, 데이터들을 가장 잘 분류할 수 있는 노드들을 찾아내는 것입니다.

 

이걸 하려면 어떻게 분류하거나 질문을 하는게 좋고 안좋은지에 대한 기분, 즉 손실함수 같은 개념이 필요합니다. 결정 트리에서는 이것을 지니 불순도(gini impurity)를 통해서 합니다.

 

아래의 예시와 같이 독감 데이터를 추상화해보겠습니다. 파란색은 독감인 데이터, 빨간색은 일반 감기인 데이터 입니다. 

지니 불순도는 여기 있는 데이터 중 독감과 일반 감기 데이터가 얼마나 섞여 있는지를 나타냅니다. 만약 여기 있는 데이터가 다 한 분류라면, 100% 순수한 데이터 셋인 것이고, 반반씩 분류가 갈려 있으면 100% 불순한 데이터 셋입니다. 지니 불순도는 데이터 넷이 정확히 얼마나 불순한지를 숫자로 표현해 줍니다.

지니 불순도는 1 에서 독감일 확률의 제곱을 빼고 일반 감기일 확률의 제곱을 빼면 됩니다. 

예를 들어 데이터가 100개이고, 70개가 독감, 30개가 일반 감기라고 해봅시다.

이 데이터 셋의 지니 불순도는

이렇게 됩니다. 그럼 모든 100개의 데이터가 독감이면

지니 불순도는

입니다. 

 

100개가 모두 일반 감기여도 똑같습니다. 지니 불순도가 낮을수록 데이터는 순수합니다. 데이터 셋 안에 있는 데이터들이 하나의 분류에 집중되어 있다는 말입니다. 가장 순수한 데이터는 지니 불순도가 0입니다.

 

반면 딱 반이 독감이고 반이 일반 감기이면 아래와 같습니다.

지니 불순도가 높을 수록 데이터가 불순한 것, 즉 데이터 셋에 다양한 분류가 섞여있다는 것입니다.

 

  • 지니 불순도는 데이터 셋의 데이터들이 얼마나 섞여있는지를 나타냅니다.
  • 지니 불순도가 작을수록 데이터 셋이 순수하고, 클수록 데이터 셋이 불순합니다.

 

2. 분류 노드 평가하기

지니 불순도를 이용해서 결정 트리의 노드를 정해봅시다.

아래의 예시를 살펴봅시다.

이걸 이용해서 결정트리를 만들어 봅시다. 이 데이터 셋은 고열, 기침, 몸살이 있는지 없는지를 속성으로, 환자가 독감인지 아닌지를 목표 변수로 갖습니다. 결정 트리를 써서 이 속성들(몸상태) 를 이용해서 목표변수(독감)이 있는지 없는지를 예측하는 것입니다. 

 

처음에는 가장 위에 있는 root node를 만들어야 합니다. 할수 있는건 아래와 같습니다.

1) 질문 노드를 만들지 않고 바로 분류 노드를 만들 수 있습니다. 예를 들어 바로 모든 데이터는 모두 독감이다, 아니면 일반 감기다.

2) '고열이 있나요?' '기침이 있나요?' '몸살이 있나요?' 이 세 질문 중 하나를 노드로 만들 수 있습니다.

 

결정 트리를 만들 때 이 선택지들 중 가장 좋은 노드를 골라야 하는데 좋다/안좋다의 기분은 지니 불순도를 활용합니다.

 

root 노드를 분류 노드로 만든다고 가정합시다.

학습에 사용하는 데이터 수는 90개인데 root노드는 가장 위에 있는 노드니까 모든 데이터가 거쳐야 하는 노드입니다. 그러기 때문에 이 90개를 모두 사영합니다. 

 

학습 데이터는 독감인 사람이 50명, 아닌 사람이 40명이 있습니다.

좋은 분류 노드는 최대한 많은 데이터를 맞게 분류해야 합니다. 그 말은 여기 있는 모든 데이터를 하나의 분류로 예측을 했을 때, 최대한 많이 맞아야 한다는 것입니다.

 

분류 노드를 만들 때는 항상 데이터 셋에서 가장 많은 분류로 만듭니다. 지금 같은 경우 독감 데이터가 일반 감기 데이터보다 많기 때문에 독감 노드를 고릅니다.

 

이 독감 노드는 얼마나 정확히 얼마나 좋은 것인지 봅시다.

좋은 독감 노드는 최대한 많은 학습 데이터를 맞출 수 있어야 합니다. 그러려면 이 데이터 셋 안에 독감 데이터가 많아야합니다. 다르게 표현하면 불순도가 낮은, 순수한 데이터 셋이어야 합니다. 불순도를 계산해보면 아래와 같습니다.

불순도가 꽤 높은데 불순도가 크다는 말은 독감과 일반 감기 데이터가 많인 섞여있다는 뜻입니다. 데이터가 불순할 때는 분류 노드로 만들면 별로 성능이 안 좋다는 말입니다.

 

분류 노드를 만들려고 하는 경우에, 분류하려는 데이터 셋의 불순도를 계산하면, 이 노드가 어느 정도의 데이터를 맞출 수 있는지 한 번에 알 수 있는 것입니다.

 

3. 좋은 질문 노드

여러 질문 중 '고열이 있나요?' 로 노드를 만드는 경우를 봅시다. 결정트리에서 좋은 질문은 데이터를 잘 나누는 질문입니다. 여러 분류의 데이터가 섞여 있을 때 '고열이 있나요?'라는 질문을 했을 때 학습 데이터가 두 개로 나뉩니다.

 

이때, 고열이 있는 데이터들은 모두 독감이고, 없는 데이터는 모두 일반 감기이면 이 질문은 엄청 데이터를 잘 나누는 것입니다.

 

이렇게 나뉘기만 하면 나중에 왼쪽 데이터 셋은 모두 독감으로 오른쪽은 모두 일반 감기로 예측하면 모든 데이터를 다 맞게 예측하는 것이기 때문에 성능이 꽤 좋은 것입니다.

반면에, 아래처럼 나뉜 데이터에 독감과 일반 감기 데이터가 섞여 있으면 좋지 않은 질문입니다.

이 데이터 셋들로 분류를 하면 성능이 좋지 않습니다.

즉, 좋은 질문 노드는 섞여있는 데이터를 잘 나눠서 점점 더 분류하기 쉽게 만들어줍니다. 나뉜 데이터 셋들이 순수할수록, 즉, 지니 불순도가 낮을수록 좋은 질문입니다.

 

4. 질문 노드 평가

질문 노드의 성능을 판단할 때는 나뉜 두 데이터 셋의 지니 불순도를 사용합니다.

1) 고열이 있는 데이터 셋 불순도

고열이 있는 데이터 셋의 불순도를 계산해보면, 50명 중 독감인 사람이 40명, 아닌 사람이 10명 있습니다. 위에서 본 공식을 이용해서 계싼하면 다음과 같이 됩니다.

2) 고열이 없는 데이터 셋 불순도

고열이 없는 사람 40명 중 독감이 사람이 10명, 아닌 사람이 30명이므로 공식을 이용하면 다음과 같이 됩니다.

3) 불순도 평균 내기

이렇게 각각 고열이 있는 데이터와 고열이 없는 데이터의 불순도를 계산했는데 이것을 평균 내주면 됩니다. 각 데이터에 크기만큼 무게를 줘서 합쳐야 합니다.

 

(분모) = 전체 사람 수

(분자) = (고열인 사람 수)x(고열인 지니 불순도) + (고열이 아닌 사람 수)x(고열이 아닌 지니 불순도)

 

이것을 계산하면 '고열이 있나요?' 질문으로 나눠진 데이터 셋들의 평균 지니 불순도는 약 0.344가 됩니다.

이런식으로 하면 '고열이 있나요?' 라는 질문이 얼마나 데이터를 잘 나누는지를 수치로 표현할 수 있습니다. 낮을수록 좋고, 높을수록 안좋은 것입니다.

 

5. 노드 고르기

여러 개의 분류, 또는 질문 노드들에서 가장 좋은 노드를 고르는 방법을 봅시다. 위에 동일한 방법으로 계산해서 나머지 질문들의 불순도를 계산해 주면 아래와 같습니다.

노드를 고르는 건 간단합니다. 여기서 불순도가 가장 낮은 노드를 고르면 됩니다.

 

분류 노드의 불순도가 가장 작으면 이미 데이터가 잘 나눠져 있기 때문에 있는 그대로 분류해도 된다는 뜻이고 질문 노드의 불순도가 가장 작으면 질문을 통해서 지금 있는 데이터 셋보다 불순도를 더 낮출 수 있다는 말입니다.

 

여기서는 '몸살이 있나요?'가 가장 낮기 때문에 이것을 root 노드의 질문으로 고르면 됩니다.

6. 모든 노드 만들기

위에서 root 노드 하나를 만드는 방법을 알아보았습니다. 나머지 노드들을 고르는 것도 똑같이 하면 됩니다.

root 노드의 왼쪽을 봅시다. 여기서부터 다시 학습 데이터를 가지고 가장 좋은 노드를 찾아주면 됩니다. 여기까지 온 학습 데이터는 모두 몸살이 있는 사람들 데이터입니다. 어차피 나머지는 이 노드에 올 수 없으니까 여기서는 이 데이터만 이용해서 불순도를 계산하면 됩니다.

 

여기서 할 수 있는 선택지는 이 데이터 셋을 기준으로 

1) 먼저 분류 노드를 만들 수 있습니다.

2) 그리고 '고열이 있나요?', '기침이 있나요?', '몸살이 있나요?' 로 새로운 질문 노드를 만들 수 있습니다.

 

사실 몸살이 있는지 없는지는 이미 쓴 질문이기 떄문에 무시해도 됩니다. 데이터가 속도처럼 숫자 값이면 50km 이상인 root 노드 질문이 있어도 100km 이하인지 물어보는 질문을 할 수 있습니다. 지금 데이터는 몸살이 있는지 없는지, 이 두개 뿐입니다. 이미 여기 있는 데이터는 모두 몸살이 있는 데이터니까 따로 생각할 필요가 없는 것입니다.

이 노드들 중에 선택을 할 수 있는데 지니 불순도를 사용해서 판단합니다.

여기 온 데이터, 즉 몸살이 있는 데이터는 모두 독감이 있다고 분류할 떄의 불순도를 계산해 봅시다.

다음은 고열이 있는지를 이용해서 나눴을 때와 기침이 있는지를 이용해서 나눴을 때의 불순도를 계산해 봅시다.

비교해봤을 때, 고열이 있나요?를 사용했을 때가 가장 지니 불순도가 낮습니다. 그러니까 이 질문을 노드로 만들어주면 됩니다.

방금 했던 이 과정을 트리의 맨 끝에 있는 leaf 노드들이 모두 분류 노드가 될 때까지 반복해주면 결정 트리를 만들 수 있습니다.

 

7. 결정 트리 깊이

트리가 몇 층까지 내려가는지를 트리의 깊이라고 합니다.

더 이상 내려가지 않게 특정 깊이를 정해주어도 됩니다.  특정 깊이까지 내려오면 더 이상 불순도를 비교하는 게 아니라 멈추고 분류 노드로 만들면 됩니다.

 

원하는 깊이까지는 가장 지니 불순도가 낮은, 학습 데이터들을 가장 순수하게 나눠주는 질문 또는 분류 노드를 고르면서 결정 트리를 만들어 나가게 됩니다.

728x90
반응형