机器学习(13)——adaboost

前言:下面介绍另外一种集成算法思想—boosting,提升学习(Boosting)是一种机器学习技术,可以用于回归和分类的问题,它 每一步产生弱预测模型(如决策树),并加权累加到总模型中;如果每一步的弱预 测模型的生成都是依据损失函数的梯度方式的,那么就称为梯度提升(Gradient boosting); 提升技术的意义:如果一个问题存在弱预测模型,那么可以通过提升技术的办法 得到一个强预测模型;
常见的模型有: Adaboost
Gradient Boosting(GBT/GBDT/GBRT)

Adaboost

Adaptive Boosting是一种迭代算法。每轮迭代中会在训练集上产生一个新的学 习器,然后使用该学习器对所有样本进行预测,以评估每个样本的重要性 (Informative)。换句话来讲就是,算法会为每个样本赋予一个权重,每次用训练 好的学习器标注/预测各个样本,如果某个样本点被预测的越正确,则将其权重 降低;否则提高样本的权重。权重越高的样本在下一个迭代训练中所占的比重就 越大,也就是说越难区分的样本在训练过程中会变得越重要;
整个迭代过程直到错误率足够小或者达到一定的迭代次数为止。
注意:是给样本增加权重,样本加权的过程可以如下图所示:

《机器学习(13)——adaboost》 image.png

算法原理

Adaboost算法将基分类器的线性组合作为强分类器,同时给分类误差率较小的 基本分类器以大的权值,给分类误差率较大的基分类器以小的权重值;构建的线 性组合为:

《机器学习(13)——adaboost》

最终分类器是在线性组合的基础上进行Sign函数转换:

《机器学习(13)——adaboost》

为什么进行转化呢?因为得到的线性组合是个连续的值,必须进行转化才能进行分类操作。

Sign函数如下图所示:

《机器学习(13)——adaboost》

为了使得预测的结果尽量可能正确,则写出损失函数,损失函数为当预测失败的时候I函数加一,损失函数如下:
《机器学习(13)——adaboost》

构建的学习器如下:

《机器学习(13)——adaboost》

带入上述损失函数公式,求得最终损失函数为:

《机器学习(13)——adaboost》

为了使损失函数最小,对上述式子进行化简,然后分别对其未知变量求偏导,可以解的未知变量,也就是前面所说的权重,求解过程如下:

《机器学习(13)——adaboost》

最终解得:

《机器学习(13)——adaboost》

其中参数e为第k轮的误差

构建模型的最终结果如图所示:

《机器学习(13)——adaboost》 image.png

构建adaboost模型的过程如下:

  1. 假设训练数据集T={(X1,Y1),(X2,Y2)….(Xn,Yn)}

  2. 初始化训练数据权重分布

一般情况下刚开始的样本权重都是一样的

  1. 使用具有权值分布Dm的训练数据集学习,得到基本分类器

  2. 计算Gm(x)在训练集上的分类误差

  3. 根据误差e计算Gm(x)模型的权重系数αm

  4. 从新获得权重训练数据集的权值分布

《机器学习(13)——adaboost》

其中Zm为为规范引子也就是归一化引子

《机器学习(13)——adaboost》

  1. 构建基本分类器的线性组合

《机器学习(13)——adaboost》

  1. 得到最终分类器

    《机器学习(13)——adaboost》

小结

主要是理解两个权重,分类器权重和样本权重

(1)根据误差率计算的权重系数αm是分类器的权重

(2)样本的权重是根据已经求得的αm,做一个归一化之后更新每个样本的权重,目的是使得划分错误的数据的权重增大。
下面以一个简单示例

#-*- conding:utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl

from sklearn.ensemble import AdaBoostClassifier#adaboost引入方法
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import make_gaussian_quantiles#造数据
## 设置属性防止中文乱码
mpl.rcParams['font.sans-serif'] = [u'SimHei']
mpl.rcParams['axes.unicode_minus'] = False
## 创建数据
X1, y1 = make_gaussian_quantiles(cov=2.,
                                 n_samples=200, n_features=2,
                                 n_classes=2, random_state=1)#创建符合高斯分布的数据集
X2, y2 = make_gaussian_quantiles(mean=(3, 3), cov=1.5,
                                 n_samples=300, n_features=2,
                                 n_classes=2, random_state=1)

X = np.concatenate((X1, X2))
y = np.concatenate((y1, - y2 + 1))
plot_step = 0.02
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, plot_step),
                     np.arange(y_min, y_max, plot_step))
#构建adaboost模型
bdt = AdaBoostClassifier(DecisionTreeClassifier(max_depth=1),
                         algorithm="SAMME.R",#可以不写
                         n_estimators=200)
#数据量大的时候,可以增加内部分类器的树深度,也可以不限制树深
#max_depth树深,数据量大的时候,一般范围在10——100之间
#数据量小的时候,一般可以设置树深度较小,或者n_estimators较小
#n_estimators 迭代次数或者最大弱分类器数:200次
#base_estimator:DecisionTreeClassifier 选择弱分类器,默认为CART树
#algorithm:SAMME 和SAMME.R 。运算规则,后者是优化算法,以概率调整权重,迭代速度快,
#需要能计算概率的分类器支持
#learning_rate:0<v<=1,默认为1,正则项 衰减指数
#loss:linear、‘square’exponential’。误差计算公式:一般用linear足够
bdt.fit(X, y)

#预测
Z = bdt.predict(np.c_[xx.ravel(), yy.ravel()])
#设置维度
Z = Z.reshape(xx.shape)
## 画图
plot_colors = "br"
class_names = "AB"

plt.figure(figsize=(10, 5), facecolor='w')
#局部子图
plt.subplot(121)
plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Paired)
for i, n, c in zip(range(2), class_names, plot_colors):
    idx = np.where(y == i)
    plt.scatter(X[idx, 0], X[idx, 1],
                c=c, cmap=plt.cm.Paired,
                label=u"类别%s" % n)
plt.xlim(x_min, x_max)
plt.ylim(y_min, y_max)
plt.legend(loc='upper right')
plt.xlabel('x')
plt.ylabel('y')
plt.title(u'AdaBoost分类结果,正确率为:%.2f%%' % (bdt.score(X, y) * 100))

#获取决策函数的数值
twoclass_output = bdt.decision_function(X)
#获取范围
plot_range = (twoclass_output.min(), twoclass_output.max())
plt.subplot(122)
for i, n, c in zip(range(2), class_names, plot_colors):
#直方图
    plt.hist(twoclass_output[y == i],
             bins=20,
             range=plot_range,
             facecolor=c,
             label=u'类别 %s' % n,
             alpha=.5)
x1, x2, y1, y2 = plt.axis()
plt.axis((x1, x2, y1, y2 * 1.2))
plt.legend(loc='upper right')
plt.ylabel(u'样本数')
plt.xlabel(u'决策函数值')
plt.title(u'AdaBoost的决策值')

plt.tight_layout()
plt.subplots_adjust(wspace=0.35)
plt.show()

结果如下:

《机器学习(13)——adaboost》 image.png

先总结一下Bagging、Boosting的区别

  1. 样本选择:Bagging算法是有放回的随机采样;Boosting算法是每一轮训练集不变,只是训练集中 的每个样例在分类器中的权重发生变化,而权重根据上一轮的分类结果进行调整;
  2. 样例权重:Bagging使用随机抽样,样例的权重;Boosting根据错误率不断的调整样例的权重值, 错误率越大则权重越大;
  3. 预测函数:Bagging所有预测模型的权重相等;Boosting算法对于误差小的分类器具有更大的权重。
  4. 并行计算:Bagging算法可以并行生成各个基模型;Boosting理论上只能顺序生产,因为后一个模 型需要前一个模型的结果;
  5. Bagging是减少模型的variance(方差);Boosting是减少模型的Bias(偏度)。
  6. Bagging里每个分类模型都是强分类器,因为降低的是方差,方差过高需要降低是过拟合; Boosting里每个分类模型都是弱分类器,因为降低的是偏度,偏度过高是欠拟合。
    原文作者:飘涯
    原文地址: https://www.jianshu.com/p/b86a0863fe45
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞