-
[Machine Learning] Decision Tree: Gini importance 구하는 함수 직접 구현하기AI/Machine Learning 2022. 11. 29. 23:34
구현에 들어가기 전에 Decision Tree와 Gini Importance를 다시 짚고 가보자.
1. Decision Tree
우리 말로 의사결정 나무라고 부르는 Decision Tree는 해석 가능한 모델이다. 즉, 예측 결과를 알 수 있을 뿐만 아니라 왜 그렇게 예측하는지에 대한 설명이 가능하다. 또한, 학습에 시간이 오래걸리는 대신 분류 시 계산이 쉽고 빨라 간단하고 정확하다는 장점이 있다.
2. Gini Importance
의사결정 나무의 분리가 잘 된 것을 판단하기 위해서는 불순도라는 개념을 먼저 알아야한다. (이미 불순도의 개념을 안다고 생각하고 넘어가겠다.)
변수 중요도란, 학습된 모형에 대하여 반응 변수와의 관련성 또는 예측 관점에서 각 변수들의 영향력을 수치화한 것이다.
Class가 총 K개 있고, 각 샘플이 해당 class에 속할 확률을 각각 pi, i = 1, ..., K라고 할 때, 특정 노드 Nj에서 지니 불순도는 다음과 같이 표현된다.
해당 노드에서 샘플들이 이질적으로 구성되어 있을수록, (모든 Class에 골고루 분포되어 있을 수록,) 지니 불순도(Gini Impurity)는 높아진다.
만약 노드의 불순도가 적어지면, 순도가 증가했다고 볼 수 있다.
3. Gini impurity 함수 구현하기
Python에서 지니 불순도를 구현하기 위해서는 해당 노드의 확률이 필요하다.
데이터가 (x,y)의 포맷으로 들어온다고 가정했을 때, 해당 노드의 확률은 numpy 라이브러리를 사용해 구할 수 있다.
def gini(self, y) : Pi = np.bitcount(y)/len(y) gini = 1 - np.sum( p * p for p in Pi if p>0) return gini
4. impurity_decrease 함수 구현하기
def _impurity_decrease(self, X, y, value): parent_gini = self._gini_importance(y) # expand the tree with X left_idx, right_idx = self._expand_tree(X, value) n, n_left, n_right = len(y), len(left_idx), len(right_idx) if n_left == 0 or n_right == 0: return 0 # each node has two children (right child and left child) children_gini = (n_left / n) * self._gini_importance(y[left_idx]) + (n_right / n) * self._gini_importance(y[right_idx]) return parent_gini - children_gini