ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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
Designed by Tistory.