我使用
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
函数构建决策树,就没有这个问题了。
请解释令人困惑的结果。
在
RandomForestRegressor
中,每棵树都是建立在数据的引导子集上的,这意味着某些样本可能会重复,而其他样本可能会被遗漏。仅使用该树的引导样本中存在的数据来计算每个节点的“值”。如果引导样本不能均匀地代表完整数据集(这很常见),则节点的平均值可能与使用完整数据集计算的平均值不同。
相比之下,
DecisionTreeRegressor
在每个节点使用整个数据集,因此您手动计算的平均值与决策树中的节点值匹配。如果您希望随机森林做同样的事情,您可以在初始化时设置bootstrap=False
,然后它将为每棵树使用整个数据集。