2015-01-09 2 views
0

몇 가지 기능이있는 데이터에서 회귀 목적을위한 임의의 포레스트 및 그라데이션 증가 회귀 트리를 학습합니다. 두 가지 모두 기능의 중요성을 계산하기 때문에 비슷한 점수를 얻지 만 이러한 점은 다소 다릅니다. 임의 숲 회귀를 들어 그라디언트 증가 회귀 트리 대 임의 포리스트에 대한 기능 중요도 계산

:

MAE: 58.70 
RMSE: 90.59 

Feature 1: 65.18 
Feature 2: 5.67 
Feature 3: 13.61 
Feature 4: 4.26 
Feature 5: 11.27 

왜 이것이다 : 그라디언트를 들어

MAE: 59.11 
RMSE: 89.11 

Importance: 

Feature 1: 64.87 
Feature 2: 0.10 
Feature 3: 29.03 
Feature 4: 0.09 
Feature 5: 5.89 

회귀 나무를 밀어? 그라디언트를 높이면 회귀 나무를 늘리므로 나무가 무작위적인 숲보다 얕다고 생각했습니다. 그러나 나는 확실하지 않다.

+0

각 알고리즘이 서로 다르게 계산해야하는 이유는 같습니다. 기능의 중요성은 잘 정의 된 속성이 아니라 예측 정확도를 말합니다. – elyase

+0

@elyase 특징의 중요도를 계산하는 방법은 앙상블 기반 트리 알고리즘의 유형과는 무관하다고 생각합니다. 아마도 여기에 설명 된대로 : http://stackoverflow.com/questions/15810339/how-are-feature-importances-in-randomforestclassifier-determined – Ojtwist

+0

관련 코드를 게시했습니다. – elyase

답변

2

그들은 모두 나무 그들은 여전히 ​​서로 다른 알고리즘입니다 기반으로, 각각의 다르게 기능 importances을 계산되어 있지만, 여기에 관련 코드 :

scikit 배우기/sklearn/앙상블/gradient_boosting.py

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 

scikit 배우기/sklearn/앙상블/forest.py

def feature_importances_(self): 
    all_importances = Parallel(n_jobs=self.n_jobs, backend="threading")(
     delayed(getattr)(tree, 'feature_importances_') 
     for tree in self.estimators_) 
    return sum(all_importances)/self.n_estimators 

그래서 다른 나무와 나무를 결합하는 다른 방법.

+3

코드가 같지 않더라도 포리스트 또는 부스터 앙상블의 모든 트리'tree '에 대해'tree.feature_importances_'를 평균하여 정확히 동일한 작업을 수행합니다. 스코어의 차이는 트리가 다른 알고리즘을 사용하여 작성된다는 사실에서 비롯됩니다. –