前面已经分析完bagging,当然不得不提boosting了。boosting方法中名气最大的要数Adaboost了。
我记得以前看别人博客的时候,有个很形象的比喻,来说明adaboost如何工作的。
adaboost的训练过程,就好比小朋友读文章。同一篇文章,每次阅读的时候,读错的汉字,多读几次(加重weight),然后下一轮读的时候,自然而然能更好地区别。最后,把所有读过的记忆合起来,就能很好地阅读这篇陌生的文章了。
adaboost一般使用的base learner叫做decision stump。它是一棵单层的决策树,weka里也有实现。由于这个算法本身很简单,但是实现因为要考虑各种情况,代码比较长,所以这里不做解析了。
adaboost的优点就是泛化能力强,这个是因为boosting的误差理论上有一个upper bound,跟base learner的个数和base learner的准确度相关。
adaboost的缺点也很明显,那就是对outlier 太敏感。这个也很好理解,因为权重不断加深嘛(这点也可以利用起来做outlier detection)
基本的adaboost是一个二分类器。也有一些改造后的adaboost(比如M1,MH)可用于多分类器。
下面进入正题,来看看weka中的adaboost是如何实现的。
constructor:
public AdaBoostM1() {
m_Classifier = new weka.classifiers.trees.DecisionStump();
}
这里可以看到weka中adaboost的base learner是decision stump
buildClassifier:
public void buildClassifier(Instances data) throws Exception {
super.buildClassifier(data);
// can classifier handle the data?
getCapabilities().testWithFail(data);
// remove instances with missing class
data = new Instances(data);
data.deleteWithMissingClass();
// only class? -> build ZeroR model
if (data.numAttributes() == 1) {
System.err.println(
"Cannot build model (only class attribut