机器学习——提升

概述

boosting是一种集成技术,试图从多个弱分类器中创建强分类器。通过从训练数据构建一个模型,然后创建第二个模型试图纠正第一个模型中的错误。不断添加模型,直到训练集被完美地预测或者添加到最大数量。

提升算法的理论意义在于:如果一个问题存在弱分类器,则可通过提升的方法来得到一个强分类器。

对决策树与随机森林的思考

  • 假定当前一定得到了m-1颗决策树,是否可以通过现有样本和决策树的信息,对第m颗决策树的建立产生有益的影响呢?
  • 各个决策树组成随机森林后,最后的投票过程可否在建立决策树时即确定呢?

集成方法

集成方法主要包括Bagging和Boosting两种方法,Bagging和Boosting都是将已有的分类或回归算法通过一定方式组合起来,形成一个性能更加强大的分类器,更准确的说这是一种分类算法的组装方法,即将弱分类器组装成强分类器的方法。

  • Bagging + 决策树 = 随机森林
  • AdaBoost + 决策树 = 提升树
  • Gradient Boosting + 决策树 =GBDT
    1、Bagging
    自举汇聚法(bootstrap aggregating),也称为bagging方法。
  • 从原始样本集中抽取训练集。每轮从原始样本集中使用Bootstraping的方法抽取n个训练样本(在训练集中,有些样本可能被多次抽取到,而有些样本可能一次都没有被抽中)。
  • 共进行k轮抽取,得到k个训练集(k个训练集之间是相互独立的)。每次使用一个训练集得到一个模型,k个训练集共得到k个模型(注:这里可以根据具体问题采用不同的分类或回归方法,如决策树、感知器等)。
  • 对分类问题:将上步得到的k个模型采用投票的方式得到分类结果。
  • 对回归问题,计算上述模型的均值作为最后的结果。(所有模型的重要性相同)
    在这里插入图片描述
    2、Boosting
    Boosting的思路则是采用重赋权(re-weighting)法迭代地训练基分类器。
  • 每一轮的训练数据样本赋予一个权重,并且每一轮样本的权值分布依赖上一轮的分类结果。
  • 基分类器之间采用序列式的线性加权方式进行组合。
    在这里插入图片描述
    3、Bagging、Boosting的区别
    样本选择
  • Bagging:训练集是在原始集中有放回选取的,从原始集中选出的各轮训练集之间是独立的。
  • Boosting:每一轮的训练集不变,只是训练集中每个样例在分类器中的权重发生变化。而权值是根据上一轮的分类结果进行调整。
    样例权重
  • Bagging:使用均匀取样,每个样例的权重相等。
  • Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大。
    预测函数
  • Bagging:所有预测函数的权重相等。
  • Boosting:每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重。
    并行计算
  • Bagging:各个预测函数可以并行生成。
  • Boosting:各个预测函数只能顺序生成,因为后一个模型参数需要前一轮模型的结果。

算法推导

AdaBoost算法推导

AdaBoost算法是基于Boosting思想的机器学习算法,AdaBoost是adaptive boosting(自适应boosting)的缩写,AdaBoost采用的是增加上一轮学习错误样本的权重的策略,其运行过程如下。

1、假设有如下数据集:
在这里插入图片描述
其中 ( x i , y i ) (x_i,y_i) (xi,yi)为第i个样本, x i x_i xi为输入向量, y i y_i yi为样本标签。

2、初始化样本权重:
在这里插入图片描述
设定每个样本的权重都是相等的,即1/N。

3、得到基本分类器:
使用具有权值分布 D m D_m Dm的训练数据集学习,得到第m个基本分类器 G m ( x ) G_m(x) Gm(x)

4、计算 G m ( x ) G_m(x) Gm(x)错误率:
在这里插入图片描述
其中,当 G m ( x i ) = y i G_m(x_i)=y_i Gm(xi)=yi时, I ( G m ( x i ) ) I(G_m(x_i)) I(Gm(xi))等于1,反之等于-1。

5、计算 G m ( x ) G_m(x) Gm(x)权重系数:
在这里插入图片描述
6、更新第m+1次样本的权重:
在这里插入图片描述
其中, Z m Z_m Zm是规范化因子,目的是让权重相加为1,使 D m + 1 D_m+1 Dm+1成为一个概率分布。
在这里插入图片描述
7、构建基本分类器的线性组合:
在这里插入图片描述
8、得到最终分类器:
在这里插入图片描述

Gradient Boosting算法推导

AdaBoost使用的是指数损失,这个损失函数的缺点是对于异常点非常敏感,因而通常在噪音比较多的数据集上表现不佳。Gradient Boosting在这方面进行了改进,使得可以使用任何损失函数 (只要损失函数是连续可导的),使模型抗噪音能力更强。
在Gradient Boosting中将负梯度作为上一轮基学习器犯错的衡量指标,在下一轮学习中通过拟合负梯度来纠正上一轮犯的错误。

梯度提升算法首先给定一个目标损失函数,它的定义域是所有可行的弱函数集合(基函数),提升算法通过迭代的选择一个负梯度方向上的基函数来逐渐逼近局部极小值。

1、假设有如下数据集:
在这里插入图片描述
其中 ( x i , y i ) (x_i,y_i) (xi,yi)为第i个样本, x i x_i xi为输入向量, y i y_i yi为样本标签。

2、给定目标损失函数:
目标是找到一个近似函数 F ( x ) F(x) F(x)使得损失函数 L ( y , F ( x ) ) L(y,F(x)) L(y,F(x))的损失值最小。
损失函数的典型定义:
在这里插入图片描述

3、构造近似函数:
假设 F ( x ) F(x) F(x)是一族基函数 f i ( x ) f_i(x) fi(x)的加权和:
在这里插入图片描述
4、扩展基函数:
以贪心思路来扩展 F ( x ) F(x) F(x)中的基函数,为了每次都能选择最优的基函数,这里使用梯度下降算法近似计算。
将所给样本代入基函数 f ( x ) f(x) f(x)得到 f ( x 1 ) , f ( x 2 ) , . . . , f ( x n ) f(x_1),f(x_2), ... , f(x_n) f(x1),f(x2),...,f(xn), 从而可以得到关于目标函数 L L L的向量,为 L ( y 1 , f ( x 1 ) ) , L ( y 2 , f ( x 2 ) ) , . . . , L ( y n , f ( x n ) ) L(y_1,f(x_1)),L(y_2,f(x_2)), ... ,L(y_n,f(x_n)) L(y1,f(x1)),L(y2,f(x2)),...,L(yn,f(xn)),我们对这个向量对于 f f f求偏导,让它们沿着负梯度方向下降一点点:
在这里插入图片描述
这里的 γ m \gamma_m γm就是步长,可以使用线性搜索求最优步长:
在这里插入图片描述
计算为伪残差 :
在这里插入图片描述
更新模型:
在这里插入图片描述

XGBoost

XGBoost是陈天奇等人开发的一个开源机器学习项目,高效地实现了GBDT算法并进行了算法和工程上的许多改进,被广泛应用在Kaggle竞赛及其他许多机器学习竞赛中并取得了不错的成绩。

XGBoost树的定义

举个例子,我们要预测一家人谁是谁,则可以先通过年龄区分开小孩和大人,然后再通过性别区分开是男是女,如下图所示。
在这里插入图片描述
就这样,训练出了2棵树tree1和tree2,类似GBDT的原理,两棵树的结论累加起来便是最终的结论,所以小孩的预测分数就是两棵树中小孩所落到的结点的分数相加:2 + 0.9 = 2.9。爷爷的预测分数同理:-1 + (-0.9)= -1.9。具体如下图所示
在这里插入图片描述
如果不考虑工程实现、解决问题上的一些差异,XGBoost与GBDT比较大的不同就是目标函数的定义。XGBoost的目标函数如下图所示:
在这里插入图片描述
其中:
红色方框中的 l l l即为损失函数,绿色方框内为正则项(包括L1正则、L2正则),蓝色方框内为常数项。

正则项:树的复杂度
XGBoost对树的复杂度包含了两个部分:

  • 一个是树里面叶子节点的个数T;
  • 一个是树上叶子节点的得分w的L2模平方(对w进行L2正则化,相当于针对每个叶结点的得分增加L2平滑,目的是为了避免过拟合)
    在这里插入图片描述

目标函数的计算

在这里插入图片描述
在这里插入图片描述
借鉴ID3/C4.5/CART的做法,使用贪心法对于当前结点进行子树划分:

  • 对于某可行划分,计算划分后的 J ( f ) J(f) J(f);
  • 对于所有可行划分,选择 J ( f ) J(f) J(f)降低最小的分割点。

枚举可行的分割点,选择增益最大的划分,继续同样的操作,直到满足某阈值或得到纯结点。
在这里插入图片描述

XGboost参数解析

XGBoost 参数
在运行XGBoost程序之前,必须设置三种类型的参数:
通用类型参数(general parameters)、booster参数和学习任务参数(task parameters)。
一般类型参数——参数决定在提升的过程中用哪种booster,常见的booster有树模型和线性模型。
Booster参数——该参数的设置依赖于我们选择哪一种booster模型。
学习任务参数——参数的设置决定着哪一种学习场景,例如,回归任务会使用不同的参数来控制着排序任务。
命令行参数——一般和xgboost的CL版本相关。
Booster参数:
1、eta[默认是0.3] 和GBM中的learning rate参数类似。通过减少每一步的权重,可以提高模型的鲁棒性。典型值0.01-0.2
2. min_child_weight[默认是1] 决定最小叶子节点样本权重和。当它的值较大时,可以避免模型学习到局部的特殊样本。但如果这个值过高,会导致欠拟合。这个参数需要用cv来调整
3. max_depth [默认是6] 树的最大深度,这个值也是用来避免过拟合的3-10
4. max_leaf_nodes 树上最大的节点或叶子的数量,可以代替max_depth的作用,应为如果生成的是二叉树,一个深度为n的树最多生成2n个叶子,如果定义了这个参数max_depth会被忽略
5. gamma[默认是0] 在节点分裂时,只有在分裂后损失函数的值下降了,才会分裂这个节点。Gamma指定了节点分裂所需的最小损失函数下降值。这个参数值越大,算法越保守。
6. max_delta_step[默认是0] 这参数限制每颗树权重改变的最大步长。如果是0意味着没有约束。如果是正值那么这个算法会更保守,通常不需要设置。
7. subsample[默认是1] 这个参数控制对于每棵树,随机采样的比例。减小这个参数的值算法会更加保守,避免过拟合。但是这个值设置的过小,它可能会导致欠拟合。典型值:0.5-1
8. colsample_bytree[默认是1] 用来控制每颗树随机采样的列数的占比每一列是一个特征0.5-1
9. colsample_bylevel[默认是1] 用来控制的每一级的每一次分裂,对列数的采样的占比。
10. lambda[默认是1] 权重的L2正则化项
11. alpha[默认是1] 权重的L1正则化项
12. scale_pos_weight[默认是1] 各类样本十分不平衡时,把这个参数设置为一个正数,可以使算法更快收敛。
通用参数:
1. booster[默认是gbtree]
  选择每次迭代的模型,有两种选择:gbtree基于树的模型、gbliner线性模型
2. silent[默认是0]
  当这个参数值为1的时候,静默模式开启,不会输出任何信息。一般这个参数保持默认的0,这样可以帮我们更好的理解模型。
3. nthread[默认值为最大可能的线程数]
  这个参数用来进行多线程控制,应当输入系统的核数,如果你希望使用cpu全部的核,就不要输入这个参数,算法会自动检测。
学习目标参数:
1. objective[默认是reg:linear]
  这个参数定义需要被最小化的损失函数。最常用的值有:binary:logistic二分类的逻辑回归,返回预测的概率非类别。multi:softmax使用softmax的多分类器,返回预测的类别。在这种情况下,你还要多设置一个参数:num_class类别数目。
2. eval_metric[默认值取决于objective参数的取之]
  对于有效数据的度量方法。对于回归问题,默认值是rmse,对于分类问题,默认是error。典型值有:rmse均方根误差;mae平均绝对误差;logloss负对数似然函数值;error二分类错误率;merror多分类错误率;mlogloss多分类损失函数;auc曲线下面积。
3. seed[默认是0]
随机数的种子,设置它可以复现随机数据的结果,也可以用于调整参数。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值