bagging生成的DecisionTreeClassifier好像都是一样的

来源:13-4 oob (Out-of-Bag) 和关于Bagging的更多讨论

慕婉清4872412

2018-10-03

bobo老师,我发现bagging生成的DecisionTreeClassifier好像都是一样的,除了random_state,其他DecisionTree的特征都一样。

下面是我的代码:
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
dt_clf = BaggingClassifier(DecisionTreeClassifier(), n_estimators=100, max_samples=100, bootstrap=True,oob_score=True)
dt_clf.fit(X, y)
print(dt_clf.estimators_)
print(dt_clf.oob_score_)

这是输出结果:
DecisionTreeClassifier(class_weight=None, criterion=‘gini’, max_depth=None,
max_features=None, max_leaf_nodes=None,
min_impurity_decrease=0.0, min_impurity_split=None,
min_samples_leaf=1, min_samples_split=2,
min_weight_fraction_leaf=0.0, presort=False,
random_state=1522406438, splitter=‘best’), DecisionTreeClassifier(class_weight=None, criterion=‘gini’, max_depth=None,
max_features=None, max_leaf_nodes=None,
min_impurity_decrease=0.0, min_impurity_split=None,
min_samples_leaf=1, min_samples_split=2,
min_weight_fraction_leaf=0.0, presort=False,
random_state=1447758011, splitter=‘best’), DecisionTreeClassifier(class_weight=None, criterion=‘gini’, max_depth=None,
max_features=None, max_leaf_nodes=None,
min_impurity_decrease=0.0, min_impurity_split=None,
min_samples_leaf=1, min_samples_split=2,
min_weight_fraction_leaf=0.0, presort=False,
random_state=1886162999, splitter=‘best’), DecisionTreeClassifier(class_weight=None, criterion=‘gini’, max_depth=None,
max_features=None, max_leaf_nodes=None,
min_impurity_decrease=0.0, min_impurity_split=None,
min_samples_leaf=1, min_samples_split=2,
min_weight_fraction_leaf=0.0, presort=False,
random_state=1931847904, splitter=‘best’), DecisionTreeClassifier(class_weight=None, criterion=‘gini’, max_depth=None,
max_features=None, max_leaf_nodes=None,
min_impurity_decrease=0.0, min_impurity_split=None,
min_samples_leaf=1, min_samples_split=2,
min_weight_fraction_leaf=0.0, presort=False,
random_state=1672360509, splitter=‘best’), DecisionTreeClassifier(class_weight=None, criterion=‘gini’, max_depth=None,
max_features=None, max_leaf_nodes=None,
min_impurity_decrease=0.0, min_impurity_split=None,
min_samples_leaf=1, min_samples_split=2,
min_weight_fraction_leaf=0.0, presort=False,
random_state=1862725847, splitter=‘best’)]
…………………………………………………………………………………………………………………………
不是说bagging要尽可能使得模型有差异化嘛,那DecisionTree的max_depth,max_features,criterion……不应该都不一样嘛?
怎么改能让每棵树的所有特征不一样?额,有这种操作吗 :)
还有一个问题就是,bagging这种操作能防止过拟合吗?因为毕竟每棵树看的训练集都不一样。我看到老师视频里的准确度都挺高的,那个准确度是真的准确吗?还是因为存在了过拟合,然后准确率提高了……bagging怎么结合留一法(leave one out)或者其他验证方式,来判断bagging到底是不是存在了过拟合?

写回答

1回答

liuyubobobo

2018-10-03

BaggingClassifier 的差异化体现在取样上。即max_samples和max_features两个参数。Bagging Classifier中的每个子模型,都是用原始样本的一小部分数据和每个数据的一小部分特征训练出来。我不知道你的数据是什么样子的,如果你的数据量很小,特征数也很小的话,max_samples和max_features设置不当,那么每个子模型都是使用近乎全部数据的全部特征训练出来的话,肯定是差不多的。


比如我看到你训练的模型,max_samples取的100,如果你的数据量只有100(或者小于100),那肯定得到决策树差不多。你的max_features参数没有设置,默认为1.0,即全部特征都参与训练,在这方面,随机性相当于没有。


你说的更多的基于DecisionTree的差异化,是随机森林。可以参考课程后续介绍的RandomForest,会提供更多基于决策树的参数设置。Bagging算法中的子模型不仅仅可以传入决策树,还可以传入任何的算法,他的随机性表现在每一个子模型训练数据的随机性上。


所有的机器学习算法,判断是否是过拟合的方式都是一样的。看是否在训练数据上准确率很高,但是在测试数据集上缺准确率很低(即泛化能力低)。判断是否过拟合和你使用什么算法无关:)


加油!:)

0
4
慕婉清4872412
太感谢老师啦~~~~一万个赞
2018-10-03
共4条回复

Python3入门机器学习 经典算法与应用  

Python3+sklearn,兼顾原理、算法底层实现和框架使用。

5838 学习 · 2437 问题

查看课程