부스팅의 상대 변수 중요도


33

Gradient Boosted Trees에서 상대 변수 중요성이 계산되는 방법에 대한 설명을 찾고 있습니다.

측정 값은 변수가 분할을 위해 선택된 횟수, 각 분할의 결과로 모델의 제곱 개선에 의해 가중치가 부여되고 모든 트리에서 평균화 됩니다. [ Elith et al. 2008, 회귀 트리 향상을위한 작업 가이드 ]

그리고 그것은 덜 추상적입니다.

나는j2^()==1J1나는2^1(V=j)

합이 터미널 노드 트리 의 비 터미널 노드 에 걸쳐있는 경우 , 는 노드 와 연관된 분할 변수 이고 는 제곱 오차의 해당 실험적 개선입니다 분할의 결과로 , 여기서 는 각각 왼쪽 및 오른쪽 딸 응답 수단이고 w_ { l}, w_ {r} 는 가중치의 해당 합계입니다. J T v t t ^ i 2 t i 2 ( R l , R r ) = w l w rJV나는2^나는2(아르 자형,아르 자형아르 자형)=아르 자형+아르 자형(와이¯와이아르 자형¯)2와이¯,와이아르 자형¯,아르 자형[ Friedman 2001, Greedy 함수 근사 : 경사 부스팅 머신 ]

마지막으로, 통계 학습의 요소 (Hastie et al. 2008) 가 여기에서 매우 유용한 것으로 여겨지 는 것은 아닙니다 . 관련 섹션 (10.13.1 페이지 367)은 위의 두 번째 참조와 매우 유사합니다. Friedman이이 책의 공동 저자라는 사실에 의해).

추신 : 상대 변수 중요성 측정은 gbm R 패키지 의 summary.gbm 에 의해 제공됩니다 . 소스 코드를 탐색하려고 시도했지만 실제 계산이 수행되는 위치를 찾을 수없는 것 같습니다.

브라우니 포인트 : R에서 이러한 음모 를 얻는 방법이 궁금합니다 .


방금 클래스별로 변수 중요도를 표시하는 방법에 대한 링크 된 질문에 대한 새로운 답변을 추가했습니다. stackoverflow.com/a/51952918/3277050
24

답변:


55

sklearn 코드는 일반적으로 R코드 보다 훨씬 깨끗하기 때문에 사용 하겠습니다 .

GradientBoostingClassifier 의 feature_importances 속성 구현은 다음과 같습니다 (개념적인 방식으로 방해가되는 일부 코드 줄을 제거했습니다).

def feature_importances_(self):
    total_sum = np.zeros((self.n_features, ), dtype=np.float64)
    for stage in self.estimators_:
        stage_sum = sum(tree.feature_importances_
                        for tree in stage) / len(stage)
        total_sum += stage_sum

    importances = total_sum / len(self.estimators_)
    return importances

이것은 이해하기 매우 쉽습니다. self.estimators_는 부스터의 개별 트리를 포함하는 배열이므로 for 루프는 개별 트리를 반복합니다. 하나의 hickup이 있습니다

stage_sum = sum(tree.feature_importances_
                for tree in stage) / len(stage)

이것은 이진이 아닌 응답 사례를 처리합니다. 여기서 우리는 각 단계에서 여러 대의 나무를 일대일 방식으로 맞 춥니 다. 합이 하나의 소환을 갖는 이진 경우에 초점을 맞추는 것이 가장 간단 tree.feature_importances_합니다. 이진 경우에 우리는 이것을 모두 다음과 같이 다시 쓸 수 있습니다.

def feature_importances_(self):
    total_sum = np.zeros((self.n_features, ), dtype=np.float64)
    for tree in self.estimators_:
        total_sum += tree.feature_importances_ 
    importances = total_sum / len(self.estimators_)
    return importances

즉, 개별 트리의 기능 중요도를 요약 한 다음 총 트리 수로 나눕니다 . 단일 트리의 기능 중요도를 계산하는 방법은 여전히 ​​남아 있습니다.

트리의 중요도 계산은 cython 레벨 에서 구현 되지만 여전히 따를 수 있습니다 . 정리 된 코드 버전은 다음과 같습니다.

cpdef compute_feature_importances(self, normalize=True):
    """Computes the importance of each feature (aka variable)."""

    while node != end_node:
        if node.left_child != _TREE_LEAF:
            # ... and node.right_child != _TREE_LEAF:
            left = &nodes[node.left_child]
            right = &nodes[node.right_child]

            importance_data[node.feature] += (
                node.weighted_n_node_samples * node.impurity -
                left.weighted_n_node_samples * left.impurity -
                right.weighted_n_node_samples * right.impurity)
        node += 1

    importances /= nodes[0].weighted_n_node_samples

    return importances

이것은 매우 간단합니다. 트리의 노드를 반복합니다. 리프 노드에 있지 않은 한이 노드의 분할에서 노드 순도의 가중 감소를 계산하여 분할 된 피쳐에 속합니다.

importance_data[node.feature] += (
    node.weighted_n_node_samples * node.impurity -
    left.weighted_n_node_samples * left.impurity -
    right.weighted_n_node_samples * right.impurity)

그런 다음 완료되면 데이터의 총 가중치 (대부분의 경우 관측 횟수)로 모두 나눕니다.

importances /= nodes[0].weighted_n_node_samples

불순물 은 나무를 키울 때 어떤 분할을 할 것인지 결정할 때 메트릭이 사용하는 일반적인 이름이라는 것을 상기 할 가치가 있습니다. 그 관점에서, 우리는 단순히 각 기능에서 얼마나 많은 분할을했는지 요약하여 트리의 모든 분할에서 불순물을 줄일 수있었습니다.

그래디언트 부스팅과 관련하여 이러한 트리는 항상 손실 함수의 그래디언트에 적합한 회귀 트리입니다.


이 매우 자세한 답변에 감사드립니다. 그것을 받아들이 기 전에 신중하게 살펴볼 시간을 주겠습니다.
Antoine

4
다양한 불순물 기준이 사용될 수있는 것처럼 보이지만 Gini 지수는 Friedman이 사용하는 기준이 아닙니다. 내 질문과 세 번째 링크의 878 줄에서 언급했듯이 Friedman은 평균 제곱 오차 불순물 기준을 개선 점수와 함께 사용했습니다 . 답변 의이 섹션을 업데이트 할 수 있다면 좋을 것입니다. 그리고 네, 그렇습니다. 무게는 실제로 관측치의 수인 것 같습니다.
앙투안

3
또는 Gini 지수와 Friedman의 원래 기준에 대한 부분을 모두 유지하고 첫 번째는 분류에 사용하고 두 번째는 회귀에 사용한다고 강조하면 대답이 더 나아질 것입니까?
앙투안

Antoine,이 업데이트에 감사드립니다. 평균 제곱 오차가 회귀 트리에 사용되는 개선 기준이라는 것을 아는 것이 정말 도움이됩니다. 그것이 분류에 어떻게 사용될 것인지는 분명하지 않았습니다. 그러나 분류를위한 그라디언트 부스팅에서도 분류 트리가 아닌 회귀 트리가 여전히 사용 중이라고 생각합니다. 적어도 파이썬에서는 회귀 분석이 각 부스팅 단계의 현재 오류에 대해 수행됩니다.
Fairly Nerdy

회귀 트리에 대해서는 올바른 것입니다.
Matthew Drury
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.