我正在寻找随机森林分类器中树数下限的理论或实验估计。
我通常会测试不同的组合并选择(使用交叉验证)提供中值最佳结果的组合。
但是,我认为使用的树的数量可能有一个下限,因为 观察和 特征,以减少对误差的方差贡献。是否有一些测试或参考我可以检查以正确调整我的分类器?
我正在寻找随机森林分类器中树数下限的理论或实验估计。
我通常会测试不同的组合并选择(使用交叉验证)提供中值最佳结果的组合。
但是,我认为使用的树的数量可能有一个下限,因为 观察和 特征,以减少对误差的方差贡献。是否有一些测试或参考我可以检查以正确调整我的分类器?
这不一定是您问题的答案。只是关于交叉验证随机森林中决策树数量的一般想法。
我看到很多人在 kaggle 和 stackexchange 中交叉验证随机森林中的树数。我还问了几个同事,他们告诉我交叉验证它们以避免过度拟合很重要。
这对我来说从来没有意义。由于每个决策树都是独立训练的,因此添加更多决策树只会使您的集成变得越来越健壮。
(这与梯度提升树不同,梯度提升树是 ada 提升的一种特殊情况,因此存在过度拟合的可能性,因为每个决策树都经过训练以更重地加权残差。)
我做了一个简单的实验:
from sklearn.datasets import load_digits
from sklearn.ensemble import RandomForestClassifier
from sklearn.grid_search import GridSearchCV
import numpy as np
import matplotlib.pyplot as plt
plt.ioff()
df = load_digits()
X = df['data']
y = df['target']
cv = GridSearchCV(
RandomForestClassifier(max_depth=4),
{'n_estimators': np.linspace(10, 1000, 20, dtype=int)},
'accuracy',
n_jobs=-1,
refit=False,
cv=50,
verbose=1)
cv.fit(X, y)
scores = np.asarray([s[1] for s in cv.grid_scores_])
trees = np.asarray([s[0]['n_estimators'] for s in cv.grid_scores_])
o = np.argsort(trees)
scores = scores[o]
trees = trees[o]
plt.clf()
plt.plot(trees, scores)
plt.xlabel('n_estimators')
plt.ylabel('accuracy')
plt.savefig('trees.png')
plt.show()
我并不是说您犯了这种认为更多树会导致过度拟合的谬论。你显然不是,因为你已经要求一个下限。这只是困扰我一段时间的事情,我认为记住这一点很重要。
(附录:统计学习的要素在第 596 页讨论了这一点,并同意我的观点。«增加 B [B = 树的数量] 确实不会导致随机森林序列过度拟合»。作者确实观察到“这个限制可以使数据过拟合”。换句话说,由于其他超参数可能导致过拟合,因此创建一个稳健的模型并不能使您免于过拟合。在交叉验证其他超参数时必须注意。 )
要回答您的问题,添加决策树将始终对您的集成有益。它总是会让它变得越来越强大。但是,当然,边际 0.00000001 的方差减少是否值得计算时间是值得怀疑的。
因此,据我了解,您的问题是您是否可以以某种方式计算或估计决策树的数量,以将误差方差降低到某个阈值以下。
我非常怀疑。对于数据挖掘中的许多广泛问题,我们没有明确的答案,更不用说像这样的具体问题了。正如 Leo Breiman(随机森林的作者)所写,统计建模中有两种文化,随机森林是他所说的模型类型,假设很少,但也非常特定于数据。这就是为什么,他说,我们不能诉诸假设检验,我们必须使用蛮力交叉验证。