为什么具有单个树的Random Forest比决策树分类器好得多?

hal*_*_me 9 python machine-learning decision-tree random-forest scikit-learn

我通过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)
Run Code Online (Sandbox Code Playgroud)

为什么随机森林分类器的结果更好(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
Run Code Online (Sandbox Code Playgroud)

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

感谢您的回复.

des*_*aut 17

带有一个估算器的随机森林估算器不仅仅是一个决策树?

嗯,这是一个很好的问题,答案结果是否定的 ; 随机森林算法不仅仅是一个单独生成的决策树的简单包.

除了集合许多树所引起的随机性之外,随机森林(RF)算法在以两种不同方式构建单个树时也包含随机性,其中没有一种存在于简单决策树(DT)算法中.

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

第二个是,当DT考虑整个训练集时,单个RF树只考虑它的自举子样本; 从文档再次:

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


RF算法基本上是两个独立想法的组合:装袋和随机选择功能(请参阅维基百科条目以获得精彩的概述).套袋基本上是我的第二点,但适用于整体; 随机选择的特征是我上面的第一点,似乎它是由Tin Kam Ho在Breiman的RF之前独立提出的(再次参见维基百科条目).Ho已经建议单独随机特征选择可以提高性能.这不完全是你在这里所做的(你仍然使用套袋中的bootstrap采样想法),但你可以通过设置bootstrap=False你的RandomForestClassifier()参数轻松复制Ho的想法.事实是,鉴于这项研究,性能的差异并不出乎意料......

准确复制单个树的行为RandomForestClassifier(),您应该使用both bootstrap=Falsemax_features=Nonearguments,即

clf = RandomForestClassifier(n_estimators=1, max_features=None, bootstrap=False)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,既不会进行自举采样也不会进行随机特征选择,并且性能应该大致等于单个决策树的性能.