前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >集成算法 | AdaBoost

集成算法 | AdaBoost

作者头像
数据STUDIO
发布2021-06-24 10:59:18
6510
发布2021-06-24 10:59:18
举报
文章被收录于专栏:数据STUDIO

提升法(Boosting)

其基评估器是相关的 ,是按顺序⼀⼀构建的。其核⼼思想是结合弱评估器的⼒量⼀次次对难以评估的样本进⾏预测,从⽽构成⼀个强评估器。提升法的代表模型Adaboost梯度提升树GBDT

工作机制: 先从最初训练集训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的训练样本在后续受到更多的关注,然后基于调整后的样本分布来训练下一个基学习器;如此重复,直至学习器数目到达事先制定的值T,最终将这个T 个基学习器进行加权结合。

Boosting最著名的代表是Adaboosting

Adaboosting算法 输入: 训练集

D=\{(x_1,y_1),(x_2,y_2),...,(x_m,y_m)\}

; 基学习算法

\frak L

,训练轮数

T

过程: 1:

\cal D_1(x)=\frac1m

初始化样本权值分布 2:

\bf{for}
\quad t=1,2,3,...,T \quad \bf{do}

3:

h_t={\frak{L}}(D,{\cal D_t});

基于分布

\frak D_t

从数据集

D

中训练出分类器

h_t

4:

\epsilon_t=P_{x \in\frak D_t }(h_t(x)\neq f(x));

估计

h_t

的分类误差率 5:

{\bf{if}}\quad \epsilon_t>0.5 \quad {\bf{then \quad break}}

6:

\alpha_t=\frac12 ln \left(\frac{1-\epsilon_t}{\epsilon_t}\right);

确定分类器

h_t

的权重 7:

更新样本分布,其中

Z_t

是规范化因子,以确保

\frak D_{t+1}

是一个分布 8:

\bf end \quad for

输出:

H(x)={\text {sign}}\left(\sum_{t=1}^T \alpha_th_t(x)\right)


AdaBoost

AdaBoost,是英文"Adaptive Boosting"(自适应增强)的缩写,由 Yoav Freund 和 Robert Schapire 在1995年提出。它的自适应在于:前一个基本分类器分错的样本会得到加强(也就是得到更高的权重),加权后的全体样本再次被用来训练下一个基本分类器。同时,在每一轮中加入一个新的弱分类 器,直到达到某个预定的足够小的错误率或达到预先指定的最大迭代次数,算法停止。

以决策树作为弱学习器的AdaBoost通常被称为最佳开箱即用的分类器。

Adaboost 迭代算法就3步:

  • 初始化训练数据的权重。

如果有N个样本,则每一个训练样本最开始时都被赋予相同的权值:1/N。

  • 训练弱分类器。

具体训练过程中,如果某个样本点已经被准确地分类,那么在构造下一个训练集中,它的权值就被降低;相反,如果某个样本点没有被准确地分类,那么它的权值就得到提高。然后,权值更新过的样本集被用于训练下一个分类器,整个训练过程如此迭代地进行下去。

  • 将各个训练得到的弱分类器组合成强分类器。

各个弱分类器的训练过程结束后,加大分类误差率小的弱分类器的权重,使其在最终的分类函数中起着较大的决定作用,而降低分类误差率大的弱分类器的权重,使其在最终的分类函数中起着较小的决定作用。换言之,误差率低的弱分类器在最终分类器中占的权重较大,否则较小。


AdaBoostClassifier

AdaBoost分类器

代码语言:javascript
复制
AdaBoostClassifier(
    base_estimator=None,
    n_estimators=50,
    learning_rate=1.0,
    algorithm='SAMME.R',
    random_state=None,
)

base_estimator : object, optional (default=None) 弱分类器。None或输入字符串,默认为None。理论上可以选择任何一个分类学习器,不过需要支持样本权重。常用CART决策树或神经网络MLP。如果为None,则弱分类器为DecisionTreeClassifier(max_depth=1) n_estimators : int, optional (default=50) 弱学习器的最大迭代次数,或者说最大的弱学习器的个数。整数,默认50,太小易欠拟合;太大易过拟合。实际调参数过程中n_estimators与learning_rate一起考虑。 learning_rate : float, optional (default=1.) 每个弱学习器的权重缩减系数。对于同样的训练集拟合效果,较小的权重缩减系数意味着需要更多的弱学习器的迭代次数。 algorithm : {'SAMME', 'SAMME.R'}, optional (default='SAMME.R') AdaBoost两种分类算法'SAMME', 'SAMME.R' ,两者的主要区别是弱学习器权重的度量。

  • 'SAMME'使用了对样本集分类效果作为弱学习器权重。
  • 'SAMME.R'使用了对样本集分类的预测概率大小作为弱学习器权重。
  • 'SAMME.R'使用了概率度量的连续值,迭代一般比'SAMME'快。但其要求弱分类学习器参数base_estimator必须限制使用支持概率预测的分类器

random_state : int, RandomState instance or None, optional (default=None)

  • 整数,random_state是随机数生成器生成的随机数种子;
  • Random_State实例,则random_state是一个随机数生成器;
  • None,随机数生成器会是np.random模块中的Random_State实例。

实例一

数据准备
代码语言:javascript
复制
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import make_gaussian_quantiles
 
# 生成2维正态分布,生成的数据按分位数分为两类,500个样本,2个样本特征,协方差系数为2 
X1, y1 = make_gaussian_quantiles(cov=2.0,n_samples=500, n_features=2,n_classes=2, random_state=1)
# 生成2维正态分布,生成的数据按分位数分为两类,400个样本,2个样本特征均值都为3,协方差系数为2 
X2, y2 = make_gaussian_quantiles(mean=(3, 3), cov=1.5,n_samples=400, n_features=2, n_classes=2, random_state=1)
#将两组数据合成一组数据
X = np.concatenate((X1, X2))
y = np.concatenate((y1, - y2 + 1))
数据可视化

两个特征,两个输出类别,用颜色区别

代码语言:javascript
复制
plt.figure(figsize=(10,8))
plt.scatter(X[:, 0], X[:, 1], marker='o', c=y)
模型建立
代码语言:javascript
复制
ABC = AdaBoostClassifier(
  DecisionTreeClassifier(max_depth=2, min_samples_split=20,
                         min_samples_leaf=5),
  algorithm="SAMME",
  n_estimators=200,
  earning_rate=0.8)

ABC.fit(X, y)

这里我们选择了'SAMME'算法,最多200个弱分类器,步⻓0.8,在实际运用中可通过交叉验证调参而选择最好的参数。拟合完了后,用网格图来看看它拟合的区域。

代码语言:javascript
复制
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02),
                     np.arange(y_min, y_max, 0.02))
Z = ABC.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.figure(figsize=(10,6))
cs = plt.contourf(xx, yy, Z, cmap=plt.cm.Paired)
plt.scatter(X[:, 0], X[:, 1], marker='o', c=y)
plt.show()

输出

查看拟合分数
代码语言:javascript
复制
>>> print("Score:" , ABC.score(X,y))
Score: 0.9133333333333333


AdaBoostRegressor

AdaBoost回归器

代码语言:javascript
复制
AdaBoostRegressor(
    base_estimator=None,
    n_estimators=50,
    learning_rate=1.0,
    loss='linear',
    random_state=None,
)

base_estimator : object, optional (default=None) 弱分类器。None或输入字符串,默认为None。理论上可以选择任何一个分类学习器,不过需要支持样本权重。常用CART决策树或神经网络MLP。如果为None,则弱分类器为DecisionTreeRegressor(max_depth=3) n_estimators : integer, optional (default=50) 弱学习器的最大迭代次数,或者说最大的弱学习器的个数。整数,默认50,太小易欠拟合;太大易过拟合。实际调参数过程中n_estimators与learning_rate一起考虑。 learning_rate : float, optional (default=1.) 每个弱学习器的权重缩减系数。对于同样的训练集拟合效果,较小的权重缩减系数意味着需要更多的弱学习器的迭代次数。 loss : {'linear', 'square', 'exponential'}, optional (default='linear') 一般使用线性就足够了。其值对应了对k个弱分类器中的第i个样本的误差的处理。 random_state : int, RandomState instance or None, optional (default=None)

  • 整数,random_state是随机数生成器生成的随机数种子;
  • Random_State实例,则random_state是一个随机数生成器;
  • None,随机数生成器会是np.random模块中的Random_State实例。

案例二

导包、数据准备
代码语言:javascript
复制
#导入所需的模块和包
import numpy as np
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeRegressor 
from sklearn.ensemble import AdaBoostRegressor
#创造数据集
rng = np.random.RandomState(1)
X = np.linspace(0, 6, 100).reshape(-1,1)
y = np.sin(X).ravel() + np.sin(6 * X).ravel() + rng.normal(0, 0.1, X.shape[0])
模型训练与预测
代码语言:javascript
复制
#训练回归模型
DTR = DecisionTreeRegressor(max_depth=4)
ABR = AdaBoostRegressor(DecisionTreeRegressor(max_depth=4),n_estimators=300, random_state=rng)
DTR.fit(X, y)
ABR.fit(X, y)
#预测结果
y_1 = DTR.predict(X) 
y_2 = ABR.predict(X)
结果可视化
代码语言:javascript
复制
#绘制可视化图形
plt.figure(figsize=(15,6))
plt.scatter(X, y, c="k", label="training samples") 
plt.plot(X, y_1, c="orange", label="DTR", linewidth=2) 
plt.plot(X, y_2, c="g", label="ABR", linewidth=2) 
plt.xlabel("data")
plt.ylabel("target")
plt.title("Boosted Decision Tree Regression", fontsize=15) 
plt.legend()
plt.show()

输出结果


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据STUDIO 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • AdaBoost
  • AdaBoostClassifier
  • 实例一
    • 数据准备
      • 数据可视化
        • 模型建立
          • 查看拟合分数
          • AdaBoostRegressor
          • 案例二
            • 导包、数据准备
              • 模型训练与预测
                • 结果可视化
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档