集成学习-面试思路

       集成学习直观上来说达到了三个臭皮匠能抵一个诸葛亮的效果,从机器学习的角度来说,集成学习融合了特征转换和正则化两个特点,通常的机器学习模型只能注重一点,这也是集成学习能达到不错的效果的原因。通常来说要求基学习器都“还行”而且方差尽量大。。

       首先最容易想到的方法就是average,如果是分类任务,就vote;如果是回归任务,取平均(证明),虽然简单但效果通常不错。考虑到不同学习器的效果是不一样的,所以进一步我们可以采用unifor的融合方式,这种情况就相当于一个线性回归,相当于线性回归中的样本X变成了一个个学习器,也相当于进行了特征转换,从X到g(x)。除此之外还有一种stacking,待补充。

        然后就是大家最为熟知的Bagging和boosting。首先时Bagging,全称bootstrap aggregating,它利用bootstrap对原始数据集进行采样,bootstrap是有放回的采样,加入我们进行了N次采样得到了N个不同的新的数据集,利用这N个数据集来训练N个学习器,最后将这N个学习器进行vote/average即可。值得注意的是,bootstrap采样后大概有1/3的数据是不会出现在新数据集中的,所以在训练学习器的时候可以使用这1/3的数据作为测试集,这就是包外估计,OOB。Bagging之所以有效是因为它减少了模型的方差。由于在bagging中,由于数据集的相似性和使用的是同一种模型,所以各个单模型具有近似的bias和variance。所以bias在求平均后不会有太大变化,反观variance,假如各个模型都是独立的,那么求平均后方差会变为1/N,而bagging中的各个模型虽然不是独立的,但相关性也不高,所以求平均能达到一定的降低variance的效果。这里给了我们一个启发,是不是想办法继续降低variance,就能使模型变得更好。从而就有了Random forest。RF结构上就是采用bagging+DT,之所以选择DT,是因为DT能很好地减小各个单模型的相关性。比如在选择分裂特征时,我们不使用全部的特征,而时随机地选取一部分作为该节点地特征,甚至可以随机地组合一些特征作为新特征。可见,一开始地bootstrap时随机地,现在选取特征也是随机地,这也是叫随机森林的原因。

        接着就是boosting,boosting的出现是源于1989KearnsValiant提出的一个理论问题,就是说弱可学习的能不能提升到强可学习的。后来证明了这是可行的,其中adaboost是最著名的代表。adaboost的宏观流程是先由原始数据训练得到一个学习器,再根据该学习器的效果来调整数据集的分布,一般是将该学习器预测错误的样本的权重增大,正确的减小,从而达到使下一个模型更加关注上一个模型预测错误的样本,再根据新的数据集训练新的学习器,依次反复得到N个学期器,最后将这个N个学习器组合即可。 通过这个宏观流程可以看出,adaboost最后得到的学习器其实是多个基学习器的线性组合,这启发了我们其实可以将其看成一个加性模型。在加性模型中要得到一个个基学习器和对应的系数,采取的方法时定义一个标签y和当前模型的损失函数,通过优化损失函数来得到两者,具体地我们采取一个前向策略,依次来估算每一个学习器及系数。将adaboost放在加性模型地框架中,它对应的损失函数是指数函数,因为adaboost是一个二分类,而指数函数是一个01损失的一个上界,而且是凸函数。传统做二分类的模型基本上损失函数都是一个01损失的上界,比如svm的hinge loss,LR的logistics loss。所以在adaboost中,每一轮我们就去最小化当前模型(上一个模型+期望模型)与y的指数损失。最小化的时候采取的策略是固定一个参数求解另一个参数,经过推导可以证明,要想最小化loss,就的保证新加入的模型表现尽可能好;而系数等于1/2 * ln(1-err / err)。但其实,用这个理论不能解释adaboost不容易过拟合的问题,间隔理论。前面说了在加性模型中我们定义一个标签y和当前模型的一个损失函数,将这个损失函数对当前模型求导,意思就是如果我们希望损失函数变小,那么当前模型应该进行怎样的变化,也就是我们该如何沿着梯度的反方向走一步,也就是下一个模型需要去学习的东西。这个概念就是我们常说的GBDT,GBM中的GB.那么GBDT又是如何而来,其实还是刚才的步骤,只不过基学习器选择决策树而已。

        GBDT的损失函数一般选择square loss,将其进行一阶泰勒展开后并适当变形后发现,要想损失变小,新加入的模型就要去拟合(y-F),即残差。这里的适当变形指的是加入一个模型的平方项,为了防止最小化时模型取负无穷,类似于一个正则化操作。其实我认为这个和后面xgbdt中泰勒公式取到二阶是一样的。取二阶的目的应该是让xgbdt能够自定义loss function,只要求其能二阶可导,都能够推导出最终的目标函数,基学习器选成决策树,再推导的时候能够将损失函数中对所有样本的统计转换成对所有结点(上数值)的统计,然后假设树的结构固定,就能得到新的目标函数。这样一来如果我们可以计算各种树结构对应的目标函数的值,选择最优的即可。但树的结构千千万,是无法计算的,所以采取贪心策略来生成树。这其实和普通的决策树生成的原理类似,ID3是信息增益,C4.5是信息增益率,cart是gini系数,而这里的是我们刚刚定义的目标函数,计算分裂前后的差值(注意还有一个gama),选择最大的即可。在选择分裂点时,gbdt采用的是遍历所有特征的所有分割点;在xgbdt中为了加速采用了近似算法,近似算法对于每个特征,只考察分位点,减少计算复杂度,其中又包括global和local两种策略。Global指的是学习每棵树前,提出候选切分点,之后每次分裂都以此为准。而local是每次分裂前都重新提出候选切分点。实际上XGBoost不是简单地按照样本个数进行分位,而是以二阶导数值(目标函数变形后看出hi对loss又加权的作用)作为权重。XGBDT能处理缺失值,关于缺失值的处理将其看与稀疏矩阵的处理看作一样。在寻找split point的时候,不会对该特征为missing的样本进行遍历统计,只对该列特征值为non-missing的样本上对应的特征值进行遍历,通过这个技巧来减少了为稀疏离散特征寻找split point的时间开销。在逻辑实现上,为了保证完备性,会分别处理将missing该特征值的样本分配到左叶子结点和右叶子结点的两种情形,计算增益后选择增益大的方向进行分裂即可。可以为缺失值或者指定的值指定分支的默认方向,这能大大提升算法的效率。如果在训练中没有缺失值而在预测中出现缺失,那么会自动将缺失值的划分方向放到右子树。xgbdt还具有行抽样,列抽样(特征,随机森林),衰减学习速率等特点。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值