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
불순물 은 나무를 키울 때 어떤 분할을 할 것인지 결정할 때 메트릭이 사용하는 일반적인 이름이라는 것을 상기 할 가치가 있습니다. 그 관점에서, 우리는 단순히 각 기능에서 얼마나 많은 분할을했는지 요약하여 트리의 모든 분할에서 불순물을 줄일 수있었습니다.
그래디언트 부스팅과 관련하여 이러한 트리는 항상 손실 함수의 그래디언트에 적합한 회귀 트리입니다.