不错的收获。
尽管没有记录,但这是由于引导抽样默认情况下发生在随机森林模型中(请参阅我的答案为什么单棵树的随机森林比决策树分类器好得多?有关 RF 算法详细信息及其与单纯“一堆”决策树的区别的更多信息)。
让我们看一个例子iris
data:
from sklearn.datasets import load_iris
from sklearn import tree
from sklearn.ensemble import RandomForestClassifier
iris = load_iris()
rf = RandomForestClassifier(max_depth = 3)
rf.fit(iris.data, iris.target)
tree.plot_tree(rf.estimators_[0]) # take the first tree
这里的结果与您报告的类似:对于除右下节点之外的所有其他节点,sum(value)
不相等samples
,因为它应该是这样的“简单”决策树.
谨慎的观察者可能会注意到这里看起来很奇怪的其他事情:虽然 iris 数据集有 150 个样本:
print(iris.DESCR)
.. _iris_dataset:
Iris plants dataset
--------------------
**Data Set Characteristics:**
:Number of Instances: 150 (50 in each of three classes)
:Number of Attributes: 4 numeric, predictive attributes and the class
树的基节点应包括所有这些节点,即samples
第一个节点只有 89。
为什么会这样?到底发生了什么?为了看看,让我们安装第二个 RF 模型,这次无引导采样(即与bootstrap=False
):
rf2 = RandomForestClassifier(max_depth = 3, bootstrap=False) # no bootstrap sampling
rf2.fit(iris.data, iris.target)
tree.plot_tree(rf2.estimators_[0]) # take again the first tree
好吧,既然我们已经禁用了引导采样,一切看起来都“很好”:value
每个节点都等于samples
,并且基节点确实包含整个数据集(150 个样本)。
因此,您描述的行为似乎确实是由于引导采样造成的,在创建样本时有更换(即最终以复制集合中每个单独决策树的样本),这些重复样本不会反映在sample
树节点的值,显示树节点的数量unique样品;尽管如此,它is反映在节点上value
.
这种情况与 RF 回归模型以及 Bagging 分类器完全类似 - 分别参见:
- sklearn RandomForestRegressor 显示的树值存在差异
- 为什么该决策树每一步的值之和不等于样本数?