功能重要性 - Bagging,scikit-learn

时间:2017-06-02 16:29:40

标签: machine-learning scikit-learn decision-tree feature-selection

对于一个项目,我使用scikit-learn的回归算法(Random Forest,Extra Trees,Adaboost and Bagging)比较了许多决策树。 为了比较和解释它们,我使用了特征重要性,但对于装袋决策树,这看起来并不可用。

我的问题:有人知道如何获取Bagging的功能重要性列表吗?

问候,Kornee

3 个答案:

答案 0 :(得分:10)

你在谈论BaggingClassifier吗?它可以与许多基本估算器一起使用,因此没有实现功能重要性。存在用于计算特征重要性的与模型无关的方法(参见例如https://github.com/scikit-learn/scikit-learn/issues/8898),scikit-learn没有使用它们。

如果将决策树作为基本估算器,您可以自己计算要素重要性:它只是EX中所有树中tree.feature_importances_的平均值:

bagging.estimators_

RandomForestClassifer在内部进行相同的计算。

答案 1 :(得分:2)

扩展 CharlesG 发布的内容,这是我重载 BaggingRegressor 的解决方案(同样适用于 BaggingClassifier)。

class myBaggingRegressor(BaggingRegressor):
    def fit(self, X, y):
        fitd = super().fit(X, y)
        # need to pad features?
        if self.max_features == 1.0:
            # compute feature importances or coefficients
            if hasattr(fitd.estimators_[0], 'feature_importances_'):
                self.feature_importances_ =  np.mean([est.feature_importances_ for est in fitd.estimators_], axis=0)
            else:
                self.coef_ =  np.mean([est.coef_ for est in fitd.estimators_], axis=0)
                self.intercept_ =  np.mean([est.intercept_ for est in fitd.estimators_], axis=0)
        else:
            # need to process results into the right shape
            coefsImports = np.empty(shape=(self.n_features_, self.n_estimators), dtype=float)
            coefsImports.fill(np.nan)
            if hasattr(fitd.estimators_[0], 'feature_importances_'):
                # store the feature importances
                for idx, thisEstim in enumerate(fitd.estimators_):
                    coefsImports[fitd.estimators_features_[idx], idx] = thisEstim.feature_importances_
                # compute average
                self.feature_importances_ = np.nanmean(coefsImports, axis=1)
            else:
                # store the coefficients & intercepts
                self.intercept_ = 0
                for idx, thisEstim in enumerate(fitd.estimators_):
                    coefsImports[fitd.estimators_features_[idx], idx] = thisEstim.coefs_
                    self.intercept += thisEstim.intercept_
                # compute
                self.intercept /= self.n_estimators
                # average
                self.coefs_ = np.mean(coefsImports, axis=1)                
        return fitd

如果 max_features <> 1.0 这可以正确处理,但我认为如果 bootstrap_features=True 将无法正常工作。

我想这是因为 sklearn 自 2017 年以来已经发展了很多,但无法让它与构造函数一起工作,而且似乎并非完全必要——唯一的原因是预先指定 feature_importances_ 属性作为无。然而,在调用 fit() 之前它甚至不应该存在。

答案 2 :(得分:0)

我遇到了同样的问题,平均功能重要性才是我感兴趣的。此外,我还需要让bagging分类器对象(即可以从其访问)公开一个feature_importance_属性。必须将其用于另一种scikit-learn算法(即具有ROC_AUC计分器的RFE)。

我选择重载BaggingClassifier ,以直接访问基本估计量的均值feature_importance(或“ coef_”参数)。

这是这样做的方法:

class BaggingClassifierCoefs(BaggingClassifier):
    def __init__(self,**kwargs):
        super().__init__(**kwargs)
        # add attribute of interest
        self.feature_importances_ = None
    def fit(self, X, y, sample_weight=None):
        # overload fit function to comute feature_importance
        fitted = self._fit(X, y, self.max_samples, sample_weight=sample_weight) # hidden fit function
        if hasattr(fitted.estimators_[0], 'feature_importances_'):
            self.feature_importances_ =  np.mean([tree.feature_importances_ for tree in fitted.estimators_], axis=0)
        else:
            self.feature_importances_ =  np.mean([tree.coef_ for tree in fitted.estimators_], axis=0)
    return(fitted)
相关问题