机器学习(13)——adaboost

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

Adaboost

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


image.png

算法原理

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

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

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

Sign函数如下图所示:


为了使得预测的结果尽量可能正确,则写出损失函数,损失函数为当预测失败的时候I函数加一,损失函数如下:

构建的学习器如下:

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

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


最终解得:

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

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


image.png

构建adaboost模型的过程如下:

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

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

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

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

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

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

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

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

  1. 构建基本分类器的线性组合
  1. 得到最终分类器


小结

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

(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

结果如下:


image.png

先总结一下Bagging、Boosting的区别

  1. 样本选择:Bagging算法是有放回的随机采样;Boosting算法是每一轮训练集不变,只是训练集中 的每个样例在分类器中的权重发生变化,而权重根据上一轮的分类结果进行调整;
  2. 样例权重:Bagging使用随机抽样,样例的权重;Boosting根据错误率不断的调整样例的权重值, 错误率越大则权重越大;
  3. 预测函数:Bagging所有预测模型的权重相等;Boosting算法对于误差小的分类器具有更大的权重。
  4. 并行计算:Bagging算法可以并行生成各个基模型;Boosting理论上只能顺序生产,因为后一个模 型需要前一个模型的结果;
  5. Bagging是减少模型的variance(方差);Boosting是减少模型的Bias(偏度)。
  6. Bagging里每个分类模型都是强分类器,因为降低的是方差,方差过高需要降低是过拟合; Boosting里每个分类模型都是弱分类器,因为降低的是偏度,偏度过高是欠拟合。

你可能感兴趣的:(机器学习(13)——adaboost)