sklearn 随机森林 - 通过森林中的各个决策树查看特征子集

ily*_*yab 5 python machine-learning random-forest scikit-learn data-science

我正在使用 scikit-learn RandomForestRegressor 并为 max_features 设置一个明确的值。当我这样做时,我期望对于森林中的每棵树,在构建树时会考虑长度 max_features 的特征的随机子集(这是正确的还是它是否从整个特征集中执行特征子采样对于每棵树的每个节点?)。我试图找出每棵树使用了哪些功能子集。

这是我现在所处位置的一个示例:

# initialize random forest with 10 trees of depth 2 (max 3 features), 
# with 10 randomly subset features selected per tree
rf = RandomForestRegressor(n_estimators=10, max_depth=2, max_features=10) 
forest = rf.fit(X,y) # fit the model

# get a list of individual DecisionTreeRegressor objects
trees = forest.estimators_ 
Run Code Online (Sandbox Code Playgroud)

如果我想找出第一棵树中使用了哪些功能,我想我可以执行以下操作:

[j for j,v in enumerate(trees[0].feature_importances_) if v > 0]
Run Code Online (Sandbox Code Playgroud)

这给了我包含具有非零特征重要性的特征的列的位置。但是,这只给出了决策树从 10 个子采样特征中选择的(最多)3 个特征。据我所知, feature_importances_ 属性不区分已使用但未选择的功能与根本未使用的功能。

我一直在查看源代码,但似乎无法找到整个功能集的子采样在DecisionTreeRegressor定义或_tree定义中发生的位置。

任何帮助将非常感激。

更新

当我阅读源代码时,我相信 splitter 类对每个节点分割(而不是每个树)的特征进行采样,并将它们存储在 splitter.features 属性中。不幸的是,我找不到访问该属性的方法。