【问题标题】:Determine number of trees in Random Forest using python使用python确定随机森林中的树数
【发布时间】:2016-03-04 05:49:03
【问题描述】:

我一直在使用随机森林进行分类任务。我读过一些参考资料,提到如果更多的树更好,我们也可以使用OOB error rate 在将树木添加到森林时获得分类错误的运行无偏估计。

但是,通过使用OOB error rate,我仍然无法确定随机森林中的最佳树木数量,因为我们应该设置将被评估的最小和最大树木数量的范围。因为,如果可以在设定的范围之外找到最佳数量的树,这是可能的。在这里,我需要您的高级建议,如何让 OOB 错误率准确返回随机森林中的最佳树数。以下是使用OOB错误率的代码,具有特定范围的最小和最大树数(10到100):

import matplotlib.pyplot as plt

from collections import OrderedDict
from sklearn.ensemble import RandomForestClassifier


ensemble_clfs = [ ("RandomForestClassifier, max_features=None",RandomForestClassifier(warm_start=True, max_features=None, oob_score=True,))]


error_rate = OrderedDict((label, []) for label, _ in ensemble_clfs)


min_estimators = 10
max_estimators = 100

for label, clf in ensemble_clfs:
    for i in range(min_estimators, max_estimators + 1):
        clf.set_params(n_estimators=i)
        clf.fit(X, Y)
        oob_error = 1 - clf.oob_score_
        error_rate[label].append((i, oob_error))


for label, clf_err in error_rate.items():
    xs, ys = zip(*clf_err)
    plt.plot(xs, ys, label=label)

plt.xlim(min_estimators, max_estimators)
plt.xlabel("n_estimators")
plt.ylabel("OOB error rate")
plt.legend(loc="upper right")
plt.show()

结果:

【问题讨论】:

    标签: python scikit-learn classification


    【解决方案1】:

    没有您需要针对的特定值,它是您认为错误的任何值。 0.1 的错误率对你有好处吗?或者你需要0.05?这一切都取决于您正在使用的数据。在某些情况下,我发现 0.2 是可以接受的。


    话虽如此,关于您正在使用的代码的几件事:

    1. 您看到“锯齿状”线作为n_estimators 增加的原因是因为您没有正确比较错误率。您需要在 RandomForestClassifier 中定义 random_state,这样您就可以从同一个池中提取数据
    2. 在某些时候,性能和速度将比您的准确性更重要,这时您需要决定什么更重要。假设在n_estimators = 100,您有 0.2 个错误,并且运行大约需要 10 分钟(取决于您的数据,只是一个粗略的估计)。但是,在n_estimators = 1000,您的错误率是 0.18,但您需要大约 25 分钟才能运行。额外的 15 分钟值得 0.02 的改进吗?这完全取决于您使用的数据类型。
    3. 如果您需要更精细的解决方案并查看它的平衡点,请将您的步骤更改为 5,可能是 3。步长 1 可能太小而无法大致了解您的错误率。一旦您大致了解了错误率与速度的差异,您就可以从那里更改优化范围。

    【讨论】:

      猜你喜欢
      • 2019-03-25
      • 2019-10-23
      • 2015-10-26
      • 2016-10-08
      • 2022-01-12
      • 2020-08-16
      • 2016-05-15
      • 2018-04-10
      相关资源
      最近更新 更多