梯度提升回归树与随机森林的特征重要性计算

Posted

技术标签:

【中文标题】梯度提升回归树与随机森林的特征重要性计算【英文标题】:Feature importance calculation for gradient boosted regression tree versus random forest 【发布时间】:2015-03-07 21:33:30 【问题描述】:

在具有一些特征的数据上,我训练了一个用于回归目的的随机森林以及梯度增强回归树。对于两者,我计算了特征重要性,我发现它们是相当不同的,尽管它们获得了相似的分数。

对于随机森林回归:

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

对于梯度提升回归树:

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

这是为什么?我想可能是因为使用梯度增强回归树,树比随机森林更浅。但我不确定。

【问题讨论】:

没有理由它们应该相同,因为每种算法计算它们的方式不同。特征重要性不是一个定义明确的属性,比如预测准确性。 @elyase 我认为计算特征重要性的方法与基于集成的树算法的类型无关。可能如此处所述:***.com/questions/15810339/… 相关代码我已经贴出来了。 【参考方案1】:

虽然它们都是基于树的,但它们仍然是不同的算法,因此每个计算特征重要性的方式不同,以下是相关代码:

scikit-learn/sklearn/ensemble/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-learn/sklearn/ensemble/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

因此,不同的树以及组合树的不同方式。

【讨论】:

即使代码不同,它们都做同样的事情:对森林中的所有树 tree 平均 tree.feature_importances_ 或提升集成。分数之间的差异仅源于树是使用不同的算法构建的。

以上是关于梯度提升回归树与随机森林的特征重要性计算的主要内容,如果未能解决你的问题,请参考以下文章

决策树与随机森林

决策树与随机森林

机器学习决策树与随机森林(转)

测量随机森林回归器中每个预测器特征重要性对目标值的影响(量化)(目标值的提升或下降)

随机森林(RF)的原理

决策树与随机森林