scikit-learn 的随机森林中单棵树的节点值存在差异

问题描述 投票:0回答:1

我使用

scikit-learn
包构建了一个随机森林模型,并可视化了第一棵树。我不明白为什么有些节点的“值”不等于平均值。

import numpy as np
from sklearn import tree
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestRegressor

X = np.array(list(range(1, 11))).reshape(-1, 1)
y = np.array([4.50, 4.75, 4.91, 5.34, 5.80, 7.05, 7.90, 8.23, 8.70, 9.00])

rf = RandomForestRegressor(n_estimators=3, max_depth=2)
rf.fit(X, y)

fig = plt.figure(figsize=(6, 3), dpi=450)

tree.plot_tree(rf[0], filled=True, precision=6)

plt.show()

如下图所示,圈出的节点的“值”为

8.88
,但我认为应该是:
(8.70+9.00)/2=8.85
。事实上,我已经检查了很多次,它返回的结果都是相似的。

但是,使用

DecisionTreeRegressor
函数构建决策树,就没有这个问题了。

See figure here

请解释令人困惑的结果。

scikit-learn random-forest decision-tree
1个回答
0
投票

RandomForestRegressor
中,每棵树都是建立在数据的引导子集上的,这意味着某些样本可能会重复,而其他样本可能会被遗漏。仅使用该树的引导样本中存在的数据来计算每个节点的“值”。如果引导样本不能均匀地代表完整数据集(这很常见),则节点的平均值可能与使用完整数据集计算的平均值不同。

相比之下,

DecisionTreeRegressor
在每个节点使用整个数据集,因此您手动计算的平均值与决策树中的节点值匹配。如果您希望随机森林做同样的事情,您可以在初始化时设置
bootstrap=False
,然后它将为每棵树使用整个数据集。

© www.soinside.com 2019 - 2024. All rights reserved.