前文:集成学习(上)
一、Bagging思想
相比于AdaBoost算法,Bagging算法的思想较为简单。
基于同样的样本集,训练出相互之间独立性较高的基学习器。
这一点很容易理解,独立性体现了多样性,只有充满多样性的思想,才更有可能发现出内在的规律。思想的多样性,不仅是对机器,对我们人类同样是重要的。
二、Bagging算法
那么如何训练独立性较高的基学习器呢?就是让基学习器从样本集中有放回地随机挑选样本,组成新的样本集。也就是实行“选修”制度,恰巧被多次选中的样本从也能反映出更高的权重,将会被重点学习。
例如,对于训练集x=[x1, x2, …, xn]和某一个基学习器hk,则基学习器挑选的样本集有可能是xk=[x1, x1, x2, x3…, xn-1],那么
对于学习器hk来说,x1将是这次学习中较为重点的样例。
习题8.4运行结果
1、基学习器数量为3时:
基学习器数量:
3
Bagging分类结果:
[ 1. 1. 1. 1. 1. 1. -1. 1. -1. 1. -1. -1. -1. 1. 1. -1. -1.]
实际分类:
[ 1 1 1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1]
第7个数据分类错误
第10个数据分类错误
第14个数据分类错误
第15个数据分类错误
2、基学习器数量为11时:
基学习器数量:
11
Bagging分类结果:
[ 1. 1. 1. 1. 1. 1. -1. 1. -1. 1. -1. -1. -1. -1. 1. -1. -1.]
实际分类:
[ 1 1 1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1]
第7个数据分类错误
第10个数据分类错误
第15个数据分类错误
3、基学习器数量为1000时:
基学习器数量:
1000
Bagging分类结果:
[ 1. 1. 1. 1. 1. 1. -1. 1. -1. 1. -1. -1. -1. 1. 1. -1. -1.]
实际分类:
[ 1 1 1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1]
第7个数据分类错误
第10个数据分类错误
第14个数据分类错误
第15个数据分类错误
三、结果分析及对比
1、Bagging运行结果分析:
本例中,采用“决策树桩”为基学习器。从结果可知,3、11、1000个基学习器时,学习结果没有大的差别。可见采用“决策树桩”这种弱学习器时,Bagging的分类效果并不理想。
2、与基学习器为“决策树”的Bagging对比:
在《机器学习》180页图8-6中,展示了基学习器为“决策树”时的运行结果,如下:
3、与AdaBoost对比
AdaBoost结果请参考前文:集成学习(上)
前文中,AdaBoost也是采用“决策树桩”为基学习器,因此可以与本文结果进行对比。
结合上面的对比,可以猜想由于每一个基学习器训练集的样本完全随机,这就导致挑选出来的训练集的样本分布可能不利于学习器得出正确结果。在基学习器为“决策树桩”这种弱学习器时,这种现象更为明显。
四、部分程序代码
def learn(self):
ht = np.zeros(17)
for t in range(self.tree_num):
tree = self.trees[t]
samples_index = []
# 生成样本分布
for i in range(self.m):
samples_index.append(random.choice(list(range(17))))
samples = tree.init_samples(samples_index)
tree.tree_generate(samples, [0, 1])
test_set = tree.init_test_set(list(range(17)))
# 累加即相当于进行投票
ht += tree.judge(test_set)
hx = np.sign(ht)
hx[hx[:] == 0] = random.choice([-1, 1])
return hx
完整程序代码【集成学习.zip】