标签:otherwise ssi 训练 方便 mes 导出 样本 learn learning
总结两种具体的提升算法:
AdaBoost算法:
AdaBoost的基本想法是不断调整训练数据中样本的权值来训练新的学习器,对于当前误分类的点在下一步中就提高权重“重点关照一下”,最后再将所有的弱分类器做加权和,对于分类正确率高的权重给得大大(更可靠),分类正确率低的给的权重低乃至是负的权重。其具体的算法可以用前向分布可加模型,配以指数损失函数得到,具体推导如下:
我们这里讨论二分类问题。设学习训练集$D=\lbrace (x_{1},y_{1}),...,(x_{N},y_{N}),y_{i}\in\lbrace -1,+1\rbrace\rbrace$, 我们有某个基准的二分类算法$b$,输出为类别$+1$或者$-1$,我们希望用$M$步学习得到某个学习器:$f=\sum_{m=1}^{M}\alpha_{m}b_{m}$使得误差:
\begin{equation}L(f)=\sum_{i=1}^{M}e^{-y_{i}f(x_{i})}\end{equation}
最小。
我们现在可以考虑其前向分步可加模型了,为方便起见我们令$f_{0}=0$。对任意的$m=1,...,T$,第$m$步学习时,我们已经得到了基模型$b_{1},...,b_{m-1}$以及相应的权重$\alpha_{k}$,且令$f_{m-1}=\sum_{k=1}^{m-1}\alpha_{k}b_{k}$, 那么我们现在只需要求$\alpha_{m}$,$b_{m}$使得$L(f_{m-1}+\alpha_{m}b_{m})$尽量小。
这时候我们计算:
\[\exp(-y_{i}f_{m-1}(x_{i})-\alpha_{m}b_{m}(x_{i})y_{i})=\begin{cases} e^{-y_{i}f_{m-1}(x_{i})}\cdot e^{-\alpha_{m}}& \text{if }y_{i}=b_{m}(x_{i}),\\ e^{-y_{i}f_{m-1}(x_{i})}\cdot e^{+\alpha_{m}} & \text{if } y_{i}\neq b_{m}(x_{i}).\end{cases}\]
上式也可以写成:
\begin{split}\exp(-y_{i}-\alpha_{m}b_{m}(x_{i})y_{i})=&(e^{+\alpha_{m}}-e^{-\alpha_{m}})\cdot \overline{w}_{m,i}l_{0-1}(b_{m}(x_{i}),y_{i})\newline +& \overline{w}_{m,i}\cdot e^{-\alpha_{m}} \end{split}
其中:$\overline{w}_{m,i}=e^{-y_{i}f_{m-1}(x_{i})}$, 上式两边同时取$\sum_{i=1}^{N}$我们立即得到:
$$L(f_{m-1}+\alpha_{m}b_{m})=(e^{\alpha_{m}}-e^{-\alpha_{m}})\sum_{i=1}^{N}\overline{w}_{m,i}l_{01}(b_{m}(x_{i}),y_{i})+e^{-\alpha_{m}}\sum_{i=1}^{N}\overline{w}_{m,i}$$
注意到要使得上式尽量小,务必使:
$$\sum_{i=1}^{N}\overline{w}_{m,i}l_{01}(b_{m}(x_{i}),y_{i})$$
尽量小, 那么b_{m}就应该以第$i$个样本赋予权重$w_{m,i}=\overline{w}_{m,i}/\overline{W}_{m}$来进行训练模型,其中$\overline{W}_{m}=\sum_{i=1}^{N}w_{m,i}.$我们同时注意到:
\begin{split}L(f_{m-1}+\alpha_{m}b_{m})=&e^{-\alpha_{m}}\sum_{i=1}^{N}\overline{w}_{m,i}(1-l_{0,1}(b_{m}(x_{i}),y_{i}))+e^{\alpha_{m}}\sum_{i=1}^{N}\overline{w}_{m,i}(l_{0,1}(b_{m}(x_{i}),y_{i}))\newline =& \overline{W}[e^{-\alpha_{m}}(1-Err_{m})+e^{+\alpha_{m}}Err_{m}]\end{split}
其中$Err_{m}$是$b_{m}$的在权重$w_{m,i}$下的误分类率。上式显然在:
$$\alpha_{m}=\frac{1}{2}\log\frac{1-Err_{m}}{Err_{m}}$$
取得最小值,所以我们应该取$\alpha_{m}=\frac{1}{2}\log\frac{1-Err_{m}}{Err_{m}}$。
现在我们总结一下上述推导出来的两个要点:
综上所述AdaBoost算法的流程如下:
输入:数据集$D=\lbrace(x_{1},y_{1})...(x_{N},y_{N})\rbrace$,其中$x_{i}\in\mathbb{R}^{P}$,$y_{i}\in\lbrace -1,+1\rbrace$; 正整数$M>0$; 基算法$b$。
输出:某分类器
Step1: 选择初始权值:$w_{1,i}=1/N$, i=1,...,N;
Step2: 对m=1,...,M, 执行:
1)以第$i$个样本配以权值$w_{m,i}$,用基算法训练得到模型$b_{m}$;
2)计算出$b_{m}$的在权重$w_{m,i}$之下的误分类率$Err_{m}$
3)计算出系数:\begin{equation}\alpha_{m}=\frac{1}{2}\log\frac{1-Err_{m}}{Err_{m}}\end{equation}
4)如果m<M则计算下一步学习的样本权重:\begin{equation}w_{m+1,i}=\begin{cases} w_{m,i}\cdot e^{\alpha_{m}}& \text{if $b_{m}$ missclassifies the i-th sample},\\ w_{m,i}\cdot e^{-\alpha_{m}} & \text{otherwise} .\end{cases}\end{equation}
除以适当的常数使得$\sum_{i=1}^{N}w_{m+1,i}=1$
Step3: 输出模型$f=\text{sign}(\sum_{m=1}^{M}\alpha_{m}b_{m})$
AdaBoost 对训练集误分类率的估计
定理:设AdaBoost第m步的误分类率为$Err_{m}$, $\gamma_{m}\triangleq\frac{1}{2}-Err_{m}$, 则最终得到的分类器$f=\text{sign}(\sum_{m=1}^{M}\alpha_{m}b_{m})$的误分类率满足:
\begin{equation}\frac{1}{N}\sum_{i=1}^{N}l_{01}(f(x_{i}),y_{i})\leq \exp(-2\sum_{m=1}^{M}\gamma_{i}^{2})\end{equation}
推论:如果对每一个弱分类器$\gamma_{m}\geq \gamma>0$,则:
\begin{equation}\frac{1}{N}\sum_{i=1}^{N}l_{01}(f(x_{i}),y_{i})\leq \exp(-2M\gamma^{2})\end{equation}
AdaBoost 的优缺点:
优点:1)分类精度很高
2)是一种框架性算法,灵活性高,可以自由选择弱分类器的类型。
3)不容易过拟合
缺点:正是由于每次对于误分类点赋予很大的权重将导致AdaBoost模型对异常点的鲁棒性很差。
LogitBoost算法
AdaBoost对于误分类点的惩罚过大造成对异常点敏感,并且不能预测类别的概率。LogitBoost算法可以弥补这两个缺憾,它采样前向分步可加模型,损失函数选取为对数损失函数,每一步迭代的时候是考虑牛顿下降法应用于误差函数来更新模型,具体说来如下:
对于数据$D=\lbrace(x_{1},y_{1}),...,(x_{N},y_{N})\rbrace$, $x_{i}\in\mathbb{R}^{P}$, $y_{i}\in\lbrace+1,-1\rbrace,$, 某种基准回归算法$b$, 我们用前向分布可加模型依次利用数据集$D$,算法$b$训练得到模型$b_{m}$, $m=1,...,M$, 最终集成为模型$f=\sum_{m=1}^{M}b_{i}$,其中损失函数我们选择:
\begin{equation}L(f)=\sum_{i=1}^{N}\log(1+e^{-y_{i}f(x_{i})})\end{equation}
并且我们可以预测概率:\begin{equation}P(Y=1\mid X=x)=\frac{1}{1+e^{-f(x)}}\end{equation}
所谓的牛顿下降法在XGBoost中有应用, 我们简要看一下。为了接下来讨论方便我们令函数:$l:\mathbb{R}\times\mathbb{R}\longrightarrow \mathbb{R}$, $l(t,y)\triangleq\log(1+e^{-ty})$。容易计算得到:
\begin{equation}\partial_{1}l(t,y)=\frac{-ye^{-ty}}{1+e^{-ty}}\end{equation}
\begin{equation}\partial^{2}_{11}l(t,y)=\frac{e^{-ty}}{(1+e^{-ty})^{2}}\end{equation}
在前向分布的第$m$步迭代的时候,我们有:
\begin{split}L(f_{m-1}+b_{m})=&\sum_{i=1}^{N}l(f_{m-1}(x_{i})+b_{m}(x_{i}),y_{i})\newline \approx&\sum_{i=1}^{N}[l(f_{m-1}(x_{i}),y_{i})+g_{m,i}b_{m}(x_{i})+\frac{1}{2}w_{m,i}b^{2}_{m}(x_{i})]\newline =& L(f_{m-1})+\sum_{i=1}^{N}w_{m,i}(b_{m}(x_{i})+g_{m,i}/w_{m,i})^{2}-\frac{1}{2}\sum_{i=1}^{N}g_{m,i}^{2}/w_{m,i}\end{split}
其中:
$$g_{m,i}=\partial_{1}l(f_{m-1}(x_{i}),y_{i}),\\ w_{m,i}=\partial^{2}_{11}l(f_{m-1}(x_{i}),y_{i}) $$
所以我们为了让$L(f_{m-1}+b_{m})$尽量小,得让:
$$\sum_{i=1}^{N}w_{m,i}(b_{m}(x_{i})+g_{m,i}/w_{m,i})^{2}$$
尽量小,这时候应该在一权重为$w_{m,i}$的MSE为损失函数训练出模型$b_{m}$。
这时我们总结一下LogitBoost算法如下:
输入:训练集$D=\lbrace(x_{1},y_{1}),...,(x_{N},y_{N})\rbrace$, 基准回归算法$b$, 正整数$M>0$
输出:分类器以及概率预测函数
Step1.令$b_{0}=0$
Step2.对$m=1,...,M:$
1)计算 $$w_{m,i}=\frac{e^{-y_{i}f_{m-1}(x_{i})}}{(1+e^{-y_{i}f_{m-1}(x_{i})})^{2}}$$
$$z_{m,i}=y_{i}(1+e^{-y_{i}f(x_{i})})$$
2)用算法$b$训练数据集D,误差函数选:
$$L(b)=\sum_{i=1}^{N}w_{m,i}(b(x_{i})-z_{m,i})^{2}$$
得到模型$b_{m}$
3)令:$$f=f_{m-1}+b_{m}$$
Step3. 输出分类器$f_{M}$以及概率预测函数$\hat{P}(Y=1\mid X=x)\triangleq \frac{1}{1+e^{-f_{M}(x)}}$
参考文献:
1. 李航:《统计学习方法》,北京,清华大学出版社,2012.
2. 周志华:《机器学习》,北京,清华大学出版社,2016.
3. Kevin P. Murphy:Machine Learning: A Probabilistic Perspective, The MIT Press Cambridge, Massachusetts London, England, © 2012 Massachusetts Institute of Technology
标签:otherwise ssi 训练 方便 mes 导出 样本 learn learning
原文地址:https://www.cnblogs.com/szqfreiburger/p/11674064.html