集成学习概念
集成学习(Ensemble learning)通过构建并结合多个学习器来完成学习任务,有时也被称为多分类器系统、基于委员会的学习等。
集成学习的一般结构为:先产生一组“个体学习器”,再用某种策略将它们结合起来。集成中只包含同种类型的个体学习器,称为同质,当中的个体学习器亦称为“基学习器”,相应的算法称为“基学习算法”。集成中包含不同类型的个体学习器,称为“异质”,当中的个体学习器称为“组建学习器”。
要获得好的集成,个体学习器应“好而不同”,即个体学习器要有一定的“准确性”,即学习器不能太坏,并且要有多样性,即个体学习器间具有差异。
集成学习错误率
集成学习分类
Adabooting
目前 boosting 方法最流行的版本是: AdaBoost
注:所谓串行生成的序列化方法就是除了训练第一个之外,其他的学习器学习都需要依赖于前面生成的学习的结果。
参考:机器学习之集成学习(ensemble learning)_perfect1t的博客-CSDN博客_集成学习
additive boosting:加性模型
Adaboost 算法采用调整样本权重的方式来对样本分布进行调整,即提高前一轮个体学习器错误分类的样本的权重,而降低那些正确分类的样本的权重,这样就能使得错误分类的样本可以受到更多的关注,从而在下一轮中可以正确分类,使得分类问题被一系列的弱分类器“分而治之”。对于组合方式,AdaBoost采用加权多数表决的方法,具体地,加大分类误差率小的若分类器的权值,减小分类误差率大的若分类器的权值,从而调整他们在表决中的作用。
损失函数
AdaBoost 算法流程
李航统计学习方法
有如下二分类数据集
(1) 初始化训练数据的权值分布,按样本个数加权
(2) 对m=1,2,...,M (弱分类器的个数,对每个弱分类器做如下):
(a)在训练集上训练,权值为D1,训练一个基分类器
(b) 计算G_m(x)在训练数据集上的分类误差率 (错误分类的样本的权重之和),I为指示函数
(c) 计算G_m(x)的系数 (弱分类器的权重, 反函数,误差率越大,则权重越小,反之越大)
(d) 更新训练数据集的权值分布
其中,Z_m为规范化因子, 它使得D_{m+1}成为一个概率分布。
(3) 构建基本分类器的线性组合
(4)得到最终的分类器
例子
训练过程、测试过程、绘图解释
Adaboost入门教程——最通俗易懂的原理介绍(图文实例)_Max的杂物仓-CSDN博客_adaboost
第一步
按样本个数平均给予权重,误差率为错误样本权值累加
import numpy as np
a=np.ones(10)*0.1#初始权重
α1=0.5*np.log(0.7/0.3) #系数计算
Out[6]: 0.42364893019360184
#更新权值
'''
x
Out[19]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
y
Out[20]: array([ 1, 1, 1, -1, -1, -1, 1, 1, 1, -1])
gx #分类器结果
Out[21]: array([ 1, 1, 1, -1, -1, -1, -1, -1, -1, -1])
'''
r=np.exp(-a1*y*gx)*a
print(r/np.sum(r))
'''
Out[18]:
array([0.07143207, 0.07143207, 0.07143207, 0.07143207, 0.07143207,
0.07143207, 0.16665851, 0.16665851, 0.16665851, 0.07143207])'''
第二步
被错误分类的样本权值提高,正确的降低
a2=0.5*np.log(3.66664)
#Out[32]: 0.6496378556882709
'''
gx=np.array([1,1,1,1,1,1,1,1,1,-1])
y
Out[40]: array([ 1, 1, 1, -1, -1, -1, 1, 1, 1, -1])
a
Out[41]:
array([0.07143207, 0.07143207, 0.07143207, 0.07143207, 0.07143207,
0.07143207, 0.16665851, 0.16665851, 0.16665851, 0.07143207])
In [38]: r2=np.exp(-a2*gx*y)*a
In [39]: r2/np.sum(r2)
Out[39]:
array([0.04545613, 0.04545613, 0.04545613, 0.16667125, 0.16667125,
0.16667125, 0.10605392, 0.10605392, 0.10605392, 0.04545613])
'''
第三步
第三个分类器
测试
'''求分类结果
x=2
y=1
x<2.5 x<8.5 x<5.5
gx=0.4236+0.6496-0.7514
Out[42]: 0.3218 #其中sign(x)是符号函数,正数返回1负数返回-1
'''
import numpy as np
import matplotlib.pyplot as plt
x=np.arange(1,11)
y=np.array([1,1,1,-1,-1,-1,1,1,1,-1])
print(x.shape,y.shape)
fig,ax=plt.subplots(1,1)
ax.scatter(x,y,c=y,lw=3)
# ax.axhline(y=0,ls="-",c="red",linewidth=1)#添加水平直线
ax.axvline(x=2.5,ls="-",c="green",linewidth=1)#添加垂直直线
ax.axvline(x=8.5,ls="-",c="red",linewidth=1)#添加垂直直线
ax.axvline(x=5.5,ls="-",c="y",linewidth=1)#添加垂直直线
ax.scatter(2,1,marker='x')
ax.legend()
结果显示
黄色点为标签为1,紫色点为-1;测试样本(2,1)这里取训练集内一个样本,绿色叉
三条竖线分别表示三个分类器,绿线左边值分数都为(分类条件x<2.5)0.4236,右边为-0.4236;黄线,红线根据分类器条件赋值。最终输出值为0.3218,相当它比较离1和-1距离,取更近的值。
总结
AdaBoost算法是模型为加法模型、损失函数为指数函数、学习算法为前向分步算法时的二分类算法。
bagging
bagging
即boostrap aggregating
,其中boostrap是一种有放回的抽样方法,抽样策略是有放回的的随机抽样,把多个模型放到一起进行结合得到结果。
目前 bagging 方法最流行的版本是: 随机森林(random forest)
随机森林 random forest
来源:机器学习分类算法(六)-随机森林算法_猫敷雪-CSDN博客
模型多样性
通常希望每一个树模型都是有个性的,整个森林才能呈现出多样性,我们从以下两个方面进行
数据随机、特征随机。
解释随机森林的概念之后,再把它们组合起来总结如下:
-
随机森林首先是一种并联的思想,同时创建多个树模型,它们之间是不会有任何影响的
-
为了满足多样性的要求,需要对数据集进行随机采样,其中包括样数据采样与特征随机,目的是让每一棵树都有个性。
-
将所有的树模型组合在一起。在分类任务中,求众数就是最终的分类结果;在回归任务中,直接求平均值即可。
-
对随机森林来说,还需讨论一些细节问题,例如树的个数是越多越好吗?树越多代表整体的能力越强,但是,如果建立太多的树模型,会导致整体效率有所下降,还需考虑时间成本。在实际问题中,树模型的个数一般取100~200个,继续增加下去,效果也不会发生明显改变。
-
在集成算法中,还有一个很实用的参数——特征重要性,特征重要性就是在数据中每一个特征的重要程度,也就是在树模型中,哪些特征被利用得更多,因为树模型会优先选择最优价值的特征。在集成算法中,会综合考虑所有树模型,如果一个特征在大部分基础树模型中都被使用并且靠近根节点,它自然比较重要。决策树分裂是选择最大信息增益、增益比,最小gini值,即纯度越大,越靠近根节点