一尘不染

为什么带有一棵树的随机森林比决策树分类器好得多?

python

我通过scikit-learn图书馆学习机器学习。我使用以下代码将决策树分类器和随机森林分类器应用于我的数据:

def decision_tree(train_X, train_Y, test_X, test_Y):

    clf = tree.DecisionTreeClassifier()
    clf.fit(train_X, train_Y)

    return clf.score(test_X, test_Y)


def random_forest(train_X, train_Y, test_X, test_Y):
    clf = RandomForestClassifier(n_estimators=1)
    clf = clf.fit(X, Y)

    return clf.score(test_X, test_Y)

为什么对于随机森林分类器来说结果要好得多(对于100次运行,随机采样2/3的数据进行训练,而1/3的数据进行测试)?

100%|███████████████████████████████████████| 100/100 [00:01<00:00, 73.59it/s]
Algorithm: Decision Tree
  Min     : 0.3883495145631068
  Max     : 0.6476190476190476
  Mean    : 0.4861783113770316
  Median  : 0.48868030937802126
  Stdev   : 0.047158171852401135
  Variance: 0.0022238931724605985
100%|███████████████████████████████████████| 100/100 [00:01<00:00, 85.38it/s]
Algorithm: Random Forest
  Min     : 0.6846846846846847
  Max     : 0.8653846153846154
  Mean    : 0.7894823428836184
  Median  : 0.7906101571063208
  Stdev   : 0.03231671150915106
  Variance: 0.0010443698427656967

具有一个估计量的随机森林估计量不仅仅是决策树吗?我做错了什么或误解了这个概念吗?

感谢您的回复。


阅读 223

收藏
2020-12-20

共1个答案

一尘不染

具有一个估计量的随机森林估计量不仅仅是决策树吗?

好吧,这是一个好问题,答案是“ 否” 。随机森林算法不只是一个简单的独立生长的决策树包。

除了由于合并许多树而引起的随机性之外,随机森林(RF)算法还在以两种不同的方式构建 单个树 时并入了随机性,而简单决策树(DT)算法中都没有这种随机性。

第一个是在每个树节点上寻找最佳分割时要考虑的特征数量:虽然DT考虑了所有特征,RF却考虑了它们的随机子集,其大小等于参数max_features(请参阅docs)。

第二点是,虽然DT考虑了整个训练集,但单个RF树仅考虑了它的自举子样本;从文档再次:

子样本大小始终与原始输入样本大小相同,但是如果bootstrap = True(默认值),则将替换绘制样本。


RF算法本质上是两个独立概念的组合:装袋和特征的随机选择(有关详细概述,请参阅Wikipedia条目)。套袋本质上是我的第二点,但适用于合奏。特征的随机选择是我在上面提到的第一点,似乎它是由Breeman
RF之前的Tin Kam
Ho独立提出的(再次参见Wikipedia条目)。Ho已经建议仅通过随机特征选择来提高性能。这与您在这里所做的不完全一样(您仍然仍然使用装袋中的引导抽样概念),但是您可以通过bootstrap=FalseRandomForestClassifier()参数中进行设置来轻松复制Ho的思想。事实是,鉴于这项研究,性能差异并不出乎意料…

确切地
复制中的单个树的行为RandomForestClassifier(),应同时使用bootstrap=Falsemax_features=None参数,即

clf = RandomForestClassifier(n_estimators=1, max_features=None, bootstrap=False)

在这种情况下,引导采样和随机特征选择均不会发生,并且性能应大致等于单个决策树的性能。

2020-12-20