의사 결정 트리 (Decision Tree)
의사 결정트리(Decision Tree)란 모델에게 질문을 던지고 YES or NO 를 판단하여
결과의 대상을 좁혀나가는 인공지능의 분류 기법 중 하나이다.
(의사 결정트리 모델을 거꾸로 뒤집어 보면 나무와 비슷한 모양이 보이기 때문에 나무(Tree)라는 이름이 붙게 되었다.)
다소 복잡해 보일 수 있는 결정 트리를 하나하나 함께 살펴보도록 하자.
오른쪽 이미지는 실습에서 진행할 레드 와인(음성 클래스)과 화이트 와인(양성 클래스)을 맞추는
이진 분류(Binary Classification) 모델이다.
결정 트리 모델을 보면 '노드(Node)'라고 부르는 네모난 질문 박스가 보일 것이다.
설명을 위해 트리의 맨 최상위에 위치한 루트 노드(Root Node)를 살펴보면, sugar, gini, samples, value라는 변수가 보일 것이다.
해당 트리는 특징(feature)으로 알코올(alcohol), 당도(sugar), 농도(pH)를 사용하였다.
최상위 루트 노드는 이 특징들 중에서도 분류 질문으로 당도(sugar)를 선택한 것이다.
노드의 내용을 분석해보면, '당도가 4.325라는 수치보다 작거나 같다 YES or NO?!' 라는 질문을 던지고 있으며,
YES일 경우에는, 왼쪽 자식 노드(Left Child Node)로
NO일 경우에는, 오른쪽 자식 노드(Right Child Node)로 이동하여 또 다른 질문을 하게 될 것이다.
그 밑에 위치한 samples는 총 샘플 데이터의 개수를 의미하는 것이고,
value배열에 담긴 '1258'이라는 숫자는 음성 클래스(레드 와인)의 개수,
반대로 '3939'는 양성 클래스(화이트 와인) 의 개수를 나타낸 숫자이다.
그림을 보면 점점 밑으로 갈 수록 총 샘플의 개수가 나누어지면서,
음성 클래스(화이트 와인)와 양성 클래스(레드 와인)가 구분되는 과정을 확인할 수 있다.
노드의 색상이 진할 수록 한쪽 클래스로 샘플이 많이 치우쳐저 있다는 뜻인데,
오른쪽 자식 노드를 보면 음성 클래스가 81개, 양성 클래스가 2194개로, 양성 클래스의 비율이 확연히 높게 분리되었다.
이처럼 결정 트리(Decision Tree)는 연속된 질문을 통해 클래스를 나누어 최종 노드에서
가장 많은 클래스가 예측 클래스가 된다.
그 다음으로, 'gini'라고 쓰여져 있는 것은 지니 불순도(Gini Impurity)라 불리는 불순도 수치이다.
지니 불순도에 대해 간략하게 짚고 넘어가 보자.
지니 불순도 (Gini Impurity)
지니 불순도(gini Impurity)가 대체 무엇일까?
새로운 개념이 나온 것 같아 어렵게 느껴질 수도 있지만, 이 그래프로 쉽게 이해가 가능하다.
구슬의 비율이 0.0일 때와 1.0일 때의 상태를 살펴보면 내용물이 파란색 구슬로 깔끔하게 분류되어 있는 모습을 확인할 수 있다.
반면, 구슬의 비율이 0.5일 때 상자의 내용물을 보면, 파란 구슬과 빨간 구슬이 뒤섞여 분류가 제대로 이루어지지 않았음을 알 수 있다.
지니 불순도는 최대 0.5 까지의 수치를 지닐 수 있는데, 그래프를 보면 알 수 있다시피,
불순도가 0에 가까울수록 분류가 잘 이루어졌다고 할 수 있다.
(말 그대로 불순도가 0이라는 것은 불순물 없이 깔끔하다는 의미이다.)
지니 불순도를 구하는 공식은 1에서 해당 비율의 제곱과 반대되는 비율의 제곱을 더하여 빼는 것이다.
이해를 위해서 아까 봤던 루트 노드를 통해 계산해보자.
총 샘플의 개수(samples) 5197개에서
sugar가 4.325보다 작거나 같은 샘플의 비율 p = (1258 / 5197)이고, 보다 큰 비율 p^ = (3939 / 5197) 이다.
이를 각각 제곱해보면,
대략 위와 같은 숫자로 계산될 것이다.
여기서 지니 불순도를 계산하기 위해, 공식대로 0.059와 0.574을 더하여 0.633이란 값을 얻고, 이 값을 다시 1에서 빼주면,
노드에 쓰여 있는 지니 불순도 0.367과 대략 비슷한 0.366으로 계산된다.
(소수점을 일부 생략하여 0.001의 오차 발생)
추가적으로 부모와 자식 노드 사이의 불순도 차이를 정보 이득이라고 부르는데,
정보 이득이 클수록 데이터가 잘 나누어졌다고 판단할 수 있다.
이렇게 해서 노드에 쓰여 있는 변수의 의미를 모두 살펴보았다.
결정 트리는 점점 깊은 층으로 내려가면서 질문의 기준인 특징(feature)을 바꾸어 가며
새로운 질문을 던지는 과정을 반복한다.
결과적으로 최종 깊이(Depth)에 다 달았을 때 가장 많은 클래스를 예측 클래스로 결정하게 되는 것이다.
이 트리는 깊이(Depth)가 3인 와인을 분류하는 결정 트리이다.
위에서 배운 개념을 적용하여 노드를 해석하며, 이 트리가 레드 와인(음성 클래스)을 선택하는 기준을 살펴보자.
노드의 질문을 분석해보면, 처음 노드에서 맨 아래 위치한 3번째 노드까지 도달하기 위해서는
sugar가 4.325보다 작거나 같고, 1.625보다는 커야 하고, alcohol은 11.025보다 작거나 같아야 한다.
결과적으로 가장 아래층에 위치한 노드들 중에서 3번째 노드의 음성 클래스 비율이 가장 높으므로
데이터가 질문의 조건에 모두 부합하여 해당 노드에 도달하게 되면, 그 데이터를 레드 와인이라고 예측할 것이다.
(실제 모델에서는 층이 훨씬 깊어 이렇게까지 해석이 쉽게 되지는 않습니다.)
이처럼 결정 트리를 사용하면 모델이 결과를 예측하는 기준을 수치로 표현할 수 있으므로,
누군가에게 분류 기준을 설명하는데 용이하고,
클래스의 비율로 데이터를 분류하므로 데이터 전처리 (Data Scaling) 과정이 필요하지 않다는 장점이 있다.
주의! 그렇다면 결정 트리(Decision Tree)는 무조건 깊이가 깊을수록 좋은 걸까?
가지치기(Pruning)는 트리의 깊이를 설정해주어 층이 너무 깊어지지 않도록 함과 동시에 과대적합을 막아주는 기술이다.
트리의 깊이가 깊다면 그만큼 질문의 수가 많아지므로 어느 정도는 모델의 정확도를 높일 수 있지만,
질문이 많으면 많아질수록 과대적합(Overfitting)되기도 쉬워진다는 위험성이 있다.
이번 포스팅에서는 의사 결정 트리(Decision Tree)에서 지니 불순도(Gini Impurity)와 가지치기(Pruning)의 개념에 대해 알아보았다.
다음 글에서는 실제로 의사 결정 트리를 구현해보고,
그리드 서치(Grid Search)를 통해 가장 적절한 지니 불순도(Gini Impurity)와 가지치기(Pruning)를 구하는 실습을 진행해보자.
(이해가 다소 힘들거나, 틀린 부분이 있다면 댓글 부탁드리겠습니다! 😊)
💖댓글과 공감은 큰 힘이 됩니다!💖