集成学习笔记

集成学习概念

        集成学习(Ensemble learning)通过构建并结合多个学习器来完成学习任务,有时也被称为多分类器系统、基于委员会的学习等。

        集成学习的一般结构为:先产生一组“个体学习器”,再用某种策略将它们结合起来。集成中只包含同种类型的个体学习器,称为同质,当中的个体学习器亦称为“基学习器”,相应的算法称为“基学习算法”。集成中包含不同类型的个体学习器,称为“异质”,当中的个体学习器称为“组建学习器”。

        要获得好的集成,个体学习器应“好而不同”,即个体学习器要有一定的“准确性”,即学习器不能太坏,并且要有多样性,即个体学习器间具有差异。

集成学习错误率

 集成学习分类

 Adabooting

目前 boosting 方法最流行的版本是: AdaBoost

注:所谓串行生成的序列化方法就是除了训练第一个之外,其他的学习器学习都需要依赖于前面生成的学习的结果。

参考:机器学习之集成学习(ensemble learning)_perfect1t的博客-CSDN博客_集成学习

additive boosting:加性模型

        Adaboost 算法采用调整样本权重的方式来对样本分布进行调整,即提高前一轮个体学习器错误分类的样本的权重,而降低那些正确分类的样本的权重,这样就能使得错误分类的样本可以受到更多的关注,从而在下一轮中可以正确分类,使得分类问题被一系列的弱分类器“分而治之”。对于组合方式,AdaBoost采用加权多数表决的方法,具体地,加大分类误差率小的若分类器的权值,减小分类误差率大的若分类器的权值,从而调整他们在表决中的作用。

损失函数

AdaBoost 算法流程

李航统计学习方法

有如下二分类数据集

                             T=\left \{ (x_1,y_1),(x_1,y_1) ,...,(x_N,y_N) \right \}{\ \ \ }y_i\epsilon Y=\left \{ -1, 1 \right \}

(1) 初始化训练数据的权值分布,按样本个数加权

                          D_1=(w_{11},w_{12},...,w_{1N}),{\ \ w_{1i}=\frac{1}{N},{\ \ }i=1,2,...,N}

(2) 对m=1,2,...,M  (弱分类器的个数,对每个弱分类器做如下):

        (a)在训练集上训练,权值为D1,训练一个基分类器

                          G_m(x):X\rightarrow \left \{ -1,1 \right \}

        (b) 计算G_m(x)在训练数据集上的分类误差率 (错误分类的样本的权重之和),I为指示函数

                          e_m=\sum _{i=1}^NP(G_m(x_i)\neq y_i)=\sum _{i=1}^Nw_{mi}I(G_m(x_i)\neq y_i)

        (c) 计算G_m(x)的系数 (弱分类器的权重, 反函数,误差率越大,则权重越小,反之越大)

                           \alpha _m=\frac{1}{2}log\frac{1-e_m}{e_m}

        (d) 更新训练数据集的权值分布
        D_{m+1}=(w_{m+1,1},\ w_{m+1,2},\ ...\ ,\ w_{m+1,N}) w_{m+1,i}=\frac{w_{mi}}{Z_m}exp(-\alpha_my_iG_m(x_i)),{\ \ }i=1,2,...,N

             其中,Z_m为规范化因子, 它使得D_{m+1}成为一个概率分布。

                           Z_m=\sum_{i=1}^{N}w_{mi}exp(-\alpha_my_iG_m(x_i))

 (3) 构建基本分类器的线性组合

f(x)=\sum_{m=1}^{M}\alpha_mG_m(x)

(4)得到最终的分类器

G(x)=sing(f(x))=sign(\sum_{m=1}^M\alpha_mG_m(x))

例子

训练过程、测试过程、绘图解释

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

baggingboostrap aggregating,其中boostrap是一种有放回的抽样方法,抽样策略是有放回的的随机抽样,把多个模型放到一起进行结合得到结果。

 目前 bagging 方法最流行的版本是: 随机森林(random forest)

随机森林 random forest

来源:机器学习分类算法(六)-随机森林算法_猫敷雪-CSDN博客

模型多样性

通常希望每一个树模型都是有个性的,整个森林才能呈现出多样性,我们从以下两个方面进行

数据随机、特征随机。

解释随机森林的概念之后,再把它们组合起来总结如下:

  1.  随机森林首先是一种并联的思想,同时创建多个树模型,它们之间是不会有任何影响的

  2.  为了满足多样性的要求,需要对数据集进行随机采样,其中包括样数据采样与特征随机,目的是让每一棵树都有个性。

  3.  将所有的树模型组合在一起。在分类任务中,求众数就是最终的分类结果;在回归任务中,直接求平均值即可。

  4. 对随机森林来说,还需讨论一些细节问题,例如树的个数是越多越好吗?树越多代表整体的能力越强,但是,如果建立太多的树模型,会导致整体效率有所下降,还需考虑时间成本。在实际问题中,树模型的个数一般取100~200个,继续增加下去,效果也不会发生明显改变。

  5. 在集成算法中,还有一个很实用的参数——特征重要性,特征重要性就是在数据中每一个特征的重要程度,也就是在树模型中,哪些特征被利用得更多,因为树模型会优先选择最优价值的特征。在集成算法中,会综合考虑所有树模型,如果一个特征在大部分基础树模型中都被使用并且靠近根节点,它自然比较重要。决策树分裂是选择最大信息增益、增益比,最小gini值,即纯度越大,越靠近根节点

sklearn实现随机森林

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值