我通过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)
为什么对于随机森林分类器来说结果要好得多(对于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
具有一个估计量的随机森林估计量不仅仅是决策树吗?我做错了什么或误解了这个概念吗?
感谢您的回复。
具有一个估计量的随机森林估计量不仅仅是决策树吗?
好吧,这是一个好问题,答案是“ 否” 。随机森林算法不只是一个简单的独立生长的决策树包。
除了由于合并许多树而引起的随机性之外,随机森林(RF)算法还在以两种不同的方式构建 单个树 时并入了随机性,而简单决策树(DT)算法中都没有这种随机性。
第一个是在每个树节点上寻找最佳分割时要考虑的特征数量:虽然DT考虑了所有特征,RF却考虑了它们的随机子集,其大小等于参数max_features(请参阅docs)。
max_features
第二点是,虽然DT考虑了整个训练集,但单个RF树仅考虑了它的自举子样本;从文档再次:
子样本大小始终与原始输入样本大小相同,但是如果bootstrap = True(默认值),则将替换绘制样本。
RF算法本质上是两个独立概念的组合:装袋和特征的随机选择(有关详细概述,请参阅Wikipedia条目)。套袋本质上是我的第二点,但适用于合奏。特征的随机选择是我在上面提到的第一点,似乎它是由Breeman RF之前的Tin Kam Ho独立提出的(再次参见Wikipedia条目)。Ho已经建议仅通过随机特征选择来提高性能。这与您在这里所做的不完全一样(您仍然仍然使用装袋中的引导抽样概念),但是您可以通过bootstrap=False在RandomForestClassifier()参数中进行设置来轻松复制Ho的思想。事实是,鉴于这项研究,性能差异并不出乎意料…
bootstrap=False
RandomForestClassifier()
要 确切地 复制中的单个树的行为RandomForestClassifier(),应同时使用bootstrap=False和max_features=None参数,即
max_features=None
clf = RandomForestClassifier(n_estimators=1, max_features=None, bootstrap=False)
在这种情况下,引导采样和随机特征选择均不会发生,并且性能应大致等于单个决策树的性能。