从决策树到Bagging,其实一点也不突兀。决策树是一个很基本的分类器,但是他容易Overfitting(因为细节分的太细,因此要引入剪枝策略)。
所谓的Overfitting可以这么理解,简单的模型能表达的东西更多,复杂的模型虽然更精确,但是可表达的东西较少。这时候,如果我的training data本身不具有全局代表性,同时我的分类器如果过于复杂,就更加无法表达样本集以外的特性,那么很可能就是有很小的training error,但是testing error很大。
所以一个可靠的办法是Bagging,把大量的base learner组合起来。比较典型的以决策树为base learner的算法有Random Forest、 VR-Trees。
Bagging的基础是希望base learner彼此独立(这样有严格的全局误差的upper bound),但是一般是做不到independent。于是,如果base learner如果是不稳定的,那么也能很大提升最后的结果。
Bagging的背景,先做这样的简单介绍,本篇主要是分析weka中Bagging代码,然后为下一篇random forests做准备。
BuildClassifier拆成几个部分(按顺序):
// can classifier handle the data?
getCapabilities().testWithFail(data);
// remove instances with missing class
data = new Instances(data);
data.deleteWithMissingClass();
//IteratedSingleClassifierEnhancer: 默认复制m_Classifier 10遍
super.buildClassifier(data);
//m_CalcOutOfBag: 是否计算OOB error
if (m_CalcOutOfBag && (m_BagSizePercent != 100)) {
throw new IllegalArgumentException("Bag size needs to be 100% if "
+ "out-of-bag error is to be