机器学习-AdaBoost提升学习组合弱分类器对乳腺癌数据二分类python实现

1. AdaBoost概述

  提升方法的基本思想是从弱分类器入手,通过数据训练,我们比较容易的到一系列弱分类器,然后组合我们得到的弱分类器,将其进行组合。构成一个强分类器。AdaBoost在每一轮训练中改变数据的权值或者概率分布,提高前一轮弱分类器错误分类的权值,降低那些被正确分类样本的权值。
  提升(Boosting)方法是一种常用的统计学习方法,应用广泛且有效。在分类问题中,它通过改变训练样本的权重,学习多个分类器,并将这些分类器进行线性组合,提高分类的性能。
  提升方法基于这样一种思想:对于一个复杂任务来说,将多个专家的判断进行适当的综合所得出的判断,要比其中任何一个专家单独的判断好。实际上,就是“三个臭皮匠顶个诸葛亮”的道理。
  提升方法通过改变每轮训练数据的权值或概率,提高被弱分类器误分类样本的权值,降低被正确分类样本的权值。加大分类误差率小的弱分类器的权值,使其在表决中起较大的作用,减小分类误差率大的弱分类器的权值,使其在表决中起较小的作用。
  这就好比,如何评估一个班级的学习状况。更关注的是,这个班级里成绩落后的一部分同学,那么我们就找到教课好的老师,来把精力多多的放在这些成绩落后的同学身上。对于那些成绩好的同学,即便是老师的精力没有那么多放在他们身上,他们的成绩也不会很差。这样,经过优秀的老师对成绩较差的这部分同学的训练,班级的成绩就会得到提升。

2. 原理

对于给定的训练数据集:
T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x N , y N ) } T=\left\{\left(x_{1}, y_{1}\right),\left(x_{2}, y_{2}\right), \ldots,\left(x_{N}, y_{N}\right)\right\} T={(x1,y1),(x2,y2),,(xN,yN)}
1.首先初始化训练数据的权值分布:
D 1 = ( ω 11 , … , ω 1 i , … ω 1 N ) , ω 1 i = 1 N D_{1}=\left(\omega_{11}, \ldots, \omega_{1 i}, \ldots \omega_{1 N}\right), \omega_{1 i}=\frac{1}{N} D1=(ω11,,ω1i,ω1N),ω1i=N1
2.对于m=1,2,…M
  1)使用具有权值分布 D m D_{m} Dm的训练数据集学习,得到基本分类器
G m ( x ) : X → { − 1 , + 1 } G_{m}(x): X \rightarrow\{-1,+1\} Gm(x):X{1,+1}
  2)计算 G m ( x ) G_{m}(x) Gm(x)在训练数据集上的分类误差率:
e m = ∑ i = 1 N P ( G m ( x i ) ≠ y i ) = ∑ i = 1 N ω m i I ( G m ( x ) ≠ y i ) e_{m}=\sum_{i=1}^{N} P\left(G_{m}\left(x_{i}\right) \neq y_{i}\right)=\sum_{i=1}^{N} \omega_{m i} I\left(G_{m}(x) \neq y_{i}\right) em=i=1NP(Gm(xi)=yi)=i=1NωmiI(Gm(x)=yi)
  3)计算 G m ( x ) G_{m}(x) Gm(x)的系数:
∂ m = 1 2 log ⁡ 1 − e m e m \partial_{m}=\frac{1}{2} \log \frac{1-e_{m}}{e_{m}} m=21logem1em
  4)更新训练数据集的权值分布:
D m + 1 = ( ω m + 1 , 1 , … , ω m + 1 , i , … , ω m + 1 , N ) D_{m+1}=\left(\omega_{m+1,1}, \ldots, \omega_{m+1, i}, \ldots, \omega_{m+1, N}\right) Dm+1=(ωm+1,1,,ωm+1,i,,ωm+1,N) ω m + 1 , i = ω m i Z m exp ⁡ ( − ∂ m y i G m ( x i ) ) , i = 1 , 2 , … N \omega_{m+1, i}=\frac{\omega_{m i}}{Z_{m}} \exp \left(-\partial_{m y_{i}} G_{m}\left(x_{i}\right)\right), i=1,2, \ldots N ωm+1,i=Zmωmiexp(myiGm(xi)),i=1,2,N
这里 Z m Z_{m} Zm是一个规范化因子
Z m = ∑ i = 1 N ω m i exp ⁡ ( − ∂ m y i G m ( x i ) ) Z_{m}=\sum_{i=1}^{N} \omega_{m i} \exp \left(-\partial_{m} y_{i} G_{m}\left(x_{i}\right)\right) Zm=i=1Nωmiexp(myiGm(xi))
它使 D m + 1 D_{m+1} Dm+1成为一个概率分布
3.3.构建基本分类器的线性组合:
f ( x ) = ∑ m = 1 M ∂ m G m ( x ) f(x)=\sum_{m=1}^{M} \partial_{m} G_{m}(x) f(x)=m=1MmGm(x)
得到最终的分类器:
G ( x ) = sign ⁡ ( f ( x ) ) = sign ⁡ ( ∑ m = 1 M ∂ m G m ( x ) ) G(x)=\operatorname{sign}(f(x))=\operatorname{sign}\left(\sum_{m=1}^{M} \partial_{m} G_{m}(x)\right) G(x)=sign(f(x))=sign(m=1MmGm(x))
最终的分类器是多个弱分类器的加权,体现了AdaBoost算法的基本思想,分类效果好的分类器权值高,分类精度次的分类器权值低,保证了分类器的分类准确度。

3. python实现

3.1 数据集

采用breast cancer二分类数据集,在sklearn.ensemble库中调用AdaBoostClassifier分类器。

3.2 python代码

from sklearn.ensemble import AdaBoostClassifier
from sklearn import datasets
from sklearn.model_selection import train_test_split

#导入乳腺癌数据集
cancer = datasets.load_breast_cancer()
cancer_x = cancer.data
cancer_y = cancer.target
X_train,X_test,y_train, y_test=train_test_split(
    cancer_x,cancer_y,test_size=0.2)#按照比例划分数据集为训练集与测试集

# 创建一个SVM分类器并进行预测
clf =AdaBoostClassifier(n_estimators=50, learning_rate=1)
'''
n_estimators基分类器提升(循环)次数,默认是50次,这个值过大,模型容易过拟合;值过小,
模型容易欠拟合。
learning_rate学习率,表示梯度收敛速度,默认为1,如果过大,容易错过最优值,如果过小
,则收敛速度会很慢;该值需要和n_estimators进行一个权衡,当分类器迭代次数较少时,
学习率可以小一些,当迭代次数较多时,学习率可以适当放大。
'''
clf.fit(X_train,y_train)
clf_y_predict=clf.predict(X_test)#通过测试数据,得到测试标签
scores = clf.score(X_test,y_test)#测试结果打分

# 打印
print('预测准确率:',scores)

4. 总结

  AdaBoost的训练误差是以指数速率下降的,且AdaBoost具有适应性,即它能适应弱分类器各自的训练误差率。AdaBoost的训练误差分析表明,AdaBoost每次迭代可以减少它在训练数据集上的分类误差率。
  在AdaBoost训练过程中,AdaBoost会使得难于分类样本的权值呈指数增长,训练将会过于偏向这类困难的样本,导致AdaBoost算法易受噪声干扰。且该算法耗时较长。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值