对于一个项目,我使用scikit-learn的回归算法(Random Forest,Extra Trees,Adaboost and Bagging)比较了许多决策树。 为了比较和解释它们,我使用了特征重要性,但对于装袋决策树,这看起来并不可用。
我的问题:有人知道如何获取Bagging的功能重要性列表吗?
问候,Kornee
答案 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)