我通过 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
带有一个估算器的随机森林估算器不仅仅是一个决策树?我做错了什么或误解了这个概念吗?
感谢您的回复 .
1 回答
嗯,这是一个很好的问题,答案结果证明是 no ;随机森林算法不仅仅是一个单独生成的决策树的简单包 .
除了集合许多树所引起的随机性之外,随机森林(RF)算法还在以两种不同方式构建单个树时结合随机性,其中没有一种存在于简单决策树(DT)算法中 .
第一个是在每个树节点上寻找最佳分割时要考虑的特征数量:当DT考虑所有特征时,RF会考虑它们的随机子集,其大小等于参数
max_features
(参见docs) .第二个是,当DT考虑整个训练集时,单个RF树只考虑它的自举子样本;再次从docs:
RF算法基本上是两个独立想法的组合:装袋和随机选择的功能(参见Wikipedia entry以获得精彩的概述) . 套袋基本上是我的第二点,但适用于整体;随机选择的特征是我上面的第一点,看起来它是由Tin Kam Ho在Breiman 's RF (again, see the Wikipedia entry). Ho had already suggested that random feature selection alone improves performance. This is not exactly what you have done here (you still use the bootstrap sampling idea from bagging, too), but you could easily replicate Ho'想法之前通过在你的
RandomForestClassifier()
论证中设置bootstrap=False
而独立提出的 . 事实是,鉴于这项研究,性能的差异并不出乎意料......要准确复制
RandomForestClassifier()
中单个树的行为,您应该同时使用bootstrap=False
和max_features=None
参数,即在这种情况下,既不会进行自举采样也不会进行随机特征选择,并且性能应该大致等于单个决策树的性能 .