我正在使用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_
如果我想知道第一棵树中哪些功能使用,我想我可以做到以下几点:
[j for j,v in enumerate(trees[0].feature_importances_) if v > 0]
它给出了包含具有非零特征重要性的特征的列的位置。但是,这只给出了10个子采样特征中决策树选择的(最多)3个特征。据我所知,feature_importances_属性不区分使用但未选择的功能与未使用的功能。
我一直在查看源代码,但似乎无法找到DecisionTreeRegressor定义或_tree定义中完整功能集的子采样的位置。
非常感谢任何帮助。
更新
我一直在阅读源代码,我相信它是分割器类,它为每个节点拆分而不是每棵树进行特征采样,并将它们存储在splitter.features属性中。不幸的是,我找不到访问该属性的方法。