我通过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
具有一个估算器的随机森林估算器不仅仅是一个决策树? 我做错了什么或误解了这个概念吗?
感谢您的回复。
答案 0 :(得分:16)
带有一个估算器的随机森林估算器不仅仅是一个决策树吗?
嗯,这是一个很好的问题,答案结果是没有;随机森林算法不仅仅是一个单独生成的决策树的简单包。
除了集合许多树所引起的随机性之外,随机森林(RF)算法在以两种不同的方式构建单个树时也包含随机性,其中没有一种存在于简单的决策树中( DT)算法。
第一个是在每个树节点上寻找最佳分割时要考虑的特征数量:当DT考虑所有特征时,RF会考虑它们的随机子集,其大小等于参数max_features
(见docs)。
第二个是,当DT考虑整个训练集时,单个RF树只考虑它的自举子样本;再次来自docs:
子样本大小始终与原始输入样本大小相同,但如果bootstrap = True(默认值),则使用替换绘制样本。
RF算法基本上是两个独立想法的组合:装袋和随机选择的功能(请参阅Wikipedia entry以获得精彩的概述)。套袋基本上是我的第二点,但适用于整体;随机选择的特征是我上面的第一点,似乎它是由Tin Kam Ho在Breiman的RF之前独立提出的(再次参见维基百科条目)。 Ho已经建议单独随机特征选择可以提高性能。这不完全是你在这里所做的(你仍然使用套袋中的bootstrap采样想法),但你可以通过在bootstrap=False
参数中设置RandomForestClassifier()
来轻松复制Ho的想法。事实是,鉴于这项研究,性能上的差异并不出乎意料......
要在RandomForestClassifier()
中复制完全单个树的行为,您应该同时使用bootstrap=False
和max_features=None
个参数,即
clf = RandomForestClassifier(n_estimators=1, max_features=None, bootstrap=False)
在这种情况下,不会发生自举采样和随机特征选择,并且性能应该大致等于单个决策树的性能。