决策在kaggle上的利器(二)

290 阅读4分钟

本文继续接上一篇

05 集成学习简介

集成学习是通过构建并组合多个学习器来完成学习任务的算法集成学习常用的有两类

Bagging:基学习器之间无强依赖关系,可同时生成的并行化方法

Boosting:基学习器之间存在强烈的依赖关系,必须串行生成基分类器的方法

Bagging (Bootstrap Aggregating)方法

let n be the number of boostrap samples

for i=1 to n do
	Draw boostrap samples of size m,D
	Train base classifier h on D

y = model(h_1(x),...h_n(x))

Boosting 方法是将“弱学习算法”提升为“强学习算法”的过程,通过反复学习得到一系列弱分类器(决策树和逻辑回归),组合这些弱分类器得到一个强分类器。Boosting 算法要涉及到两个部分,加法模型和前向分步算法。

加法模型就是说强分类器由一系列弱分类器线性相加而成般组合形式如下

F_M(x;P)=\sum_{m=1}^n\beta_mh(x;a_m)

其中,l (x; am)是弱分类器,m 是弱分类器学习到的最优参数,m 是弱学习在强分类器中所占比重,P 是所有 m 和βm 的组合。这些弱分类器线性相加组成强分类器

前向分步是在训练过程中,下一轮迭代产生的分类器是在上轮的基础上训练得来的。即

F_m(x)=F_{m-1}(x)+\beta_mh_m(x;a_m)

06 Bagging:随机森林

随机森林= bagging+决策树

同时训练多个决策树,预测时综合考虑多个结果进行预测,例如取多个节点的均值(回归),或者是众数(分类)。

  • 消除了决策树容易过拟合的缺点

  • 减小了预测的方差,预测值不会因训练数据的小变化而剧烈变化

随机性体现在两点

从原来的训练数据集随机(带放回 bootstrap)取一个子集作为森林中某一个决策树的训练数据集

每一次选择分又的特征时,限定为在随机选择的特征的子集中寻找一个特征。

随机森林实践

现有某公司的员工离职数据,我们通过构建决策树和随机森林来预测某一员工是否会离职。并找出影响员工离职的重要特征

github.com/TuringEmmy/…

07 Boosting:Adaboost

Adaboostt 的理解

Adaboostl 的思想是将关注点放在被错误分类的样本上,减小上一轮被正确分类的样本权值提高被错误分类的样本权值

Adaboost 采用加权投票的方法分类误差小的弱分类器的权重大,而分类误差大的弱分类器的权重小。

image-20200625212043739

Adaboostt 的算法流程

假设输入训练数据为T={ (x1, y1), (x2, y2), (xN, yN) }

其中x_i\in X\in R^n, y_i\in Y=-1,1, 迭代次数即弱分类器个数为 M

  1. 初始化训练样本的权值分布为

D1= (w_{1,1},w_{1,2},...,w_{1,i}),w_{1,i}=\frac{1}{N},i=1,2,...,N01=六,i=1,2, …, N

  1. 对于 m=1,2,...,M

a)使用具有权值分布D_m的训练数据集进行学习,得到弱分类器G_m(x)

b) 计算 G_m(x)在训练数据集上的分类误差率

e_m=\sum_{i=1}^Nw_{m,i}I(G_m(x_i)\neq y_i)

c) 计算G_m(x)在强分类器中所占的权重

\alpha_m=\frac{1}{2}\log \frac{1-e_m}{e_m}

(d)更新训练数据集的权值分布(这里,z_m 是归一化因子,为了使样本的概率分布和为 1)

w_{m+1,i}=\frac{w_{m,i}}{z_m}\exp(-\alpha_m y_iG_m(x_i)),i=1,2,...,10\\
z_m=\sum_{i=1}^Nw_{m,i}\exp(-\alpha _my_iG_m(x_i))
  1. 得到最终的分类器为
F(x)=sign(\sum_{i=1}^N\alpha_mG_m(x))
Adaboost 的证明

假设经过 m-1 轮迭代,得到弱分类器 Fm-l (x),根据前向分布,有:

F_m(x)=F_{m-1}(x)+\alpha_mG_m(x)

AdaBoosth 的损失函数是指数损失,则有

Loss=\sum_{i=1}^N\exp(-y_iF_m(x_i))=\sum_{i=1}^N\exp(-y_i(F_{m-1}(x_i)+\alpha_mG_m(x_i)))

因为 F_{m-1}(x)是已知的,所以将其移到前面

Loss=\sum_{i=1}^N\widetilde{w_{m,i}}\exp(-y_i\alpha_mG_m(x_i))

其中:\widetilde{w_{m,i}}=\exp(-y_i(F_{m-1}(x)))是每轮迭代的样本权重,证明化简如下:

\widetilde{w_{m,i}}=\exp(-y_i(F_{m-1}(x_i)+\alpha_{m-1}G_{m-1}(x_i)))\\
=\widetilde{w_{{m-1},i}}\exp(-y_i\alpha_{m-1}G_{m-1}(x_i))

继续化简loss

Loss=\sum_{i-1}^N\widetilde{w_{{m-1},i}}\exp(-y_i\alpha_{m-1}G_{m-1}(x_i))\\
=\sum_{y_i=G_m(x_i)}\widetilde{w_{{m-1},i}}\exp(-y_i\alpha_{m-1}G_{m-1}(x_i))

重写Loss:

Loss=\sum_{N}^{i=1}w_{m,i}((1-e_m)\exp(-\alpha_m)+e_m\exp(\alpha_m))

\alpha_m求偏导,并令其为0,则有:

\alpha_m=\frac{1}{2}\log \frac{1-e_m}{e_m}
Adaboostt 的实践

Adaboosti 可以看作是加法模型、损失函数为指数损失函数、学习算法为前向分布算法时的二分类学习方法。接下来我们使用 s learnt 中 Ada Boost 的接口进行实践:

sklearn-AdaBoostClassifier

class sklearn.ensemble.AdaBoostClassifier(base_estimator=None, *, n_estimators=50, learning_rate=1.0, algorithm='SAMME.R', random_state=None)[source]

这里是本人打比赛开始接触的bagging和boosting的集成学习方法,作为一个深度学习工程师,第一次感受到机器学习算法在各大比赛上的优势。

让我们一起分享,共同成长,分享使我们在编程路上并不孤独。快来扫描微信二维码,与博主一起快乐学习吧!