集成学习 - AdaBoost

Adaboost 它的思想是, 通过几个弱分类器, 然后训练出一个强分类器, 真的是三个臭皮匠赛过诸葛亮 我觉得是最为适合的. 还有一点它的数学理论也是很完美的, 跟SVM一样. 我自己感觉, 这种思想, 真的是, 将穷人的智慧发挥到极致. 想到句口号 "聚是一团火, 散是满天星" 这样的意思. 我这提了穷, 是想到了, Hadoop - HDFS 分, 也是用一些廉价的机器, 通过有机地组织起来, 就成了强大的一个团队.(注意跟Bagging的区别哦)

Adaboost vs Gradientboost

  • 如何训练一个模型

  • 如何集成模型

    Adaboost 是把原来的训练数据 的权重变了. 而 Gdboost 是基于残差 来再优化的,比如树的方式来展开(xgboost), 确实是非常强大的, 尤其在应用上, 我之前,关注最多是SVM 和Adaboost. 现在来再来回顾一波细节.

Boosting

大概流程

Step1:

​ 首先对样本 X, 每一条训练数据 \(x_i\), (表示 X的一行) 都赋予一个权值(假设都为1), 然后训练出一个模型 \(h_i(X)\)

Setp2:

​ 根据 \(h_1(X)\) 的预测效果, 来**重新调整 X的每条数据 \(x_i\) 的权值, 再重新训练出模型 \(h_2(X)\)

Step3:

​ 重复第二步, m 次, 得到训练出来的模型 \(h_m(X)\)

集成: 假设为2元分类, 标签为 1 or -1

扫描二维码关注公众号,回复: 8116366 查看本文章

\(h_m(X) = sign(\sum \limits _{i}^mw_ih_i(x)) \ 其中 \ h(X) \in (1, -1)\)

假设是多元分类 i = [A,B,C,D..]

\(h_m(X) = arg \ max_i (\sum \limits_{i=1}^m w_i 1[h_i(x)]) \ 其中 h(x)=i\)

多个类别, 预测, 正确就为1, 错就是0, 然后再 乘上权值, 再求和, 最后看哪个 i 最大的即为类别.

具体实现

首先, 对样本初始化一个权重向量,(多个样本嘛), 里面的值都相等.

然后进入循环:

​ 使用带权重的的训练数据训练一个模型

​ 为预测错误的训练数据增大权重

使用带权重的 "民主投票" 的方式 做最后的结果

然后,嗯..

原 paper 是这样描述的 (纯手打一边, 印象深, 拒绝贴图):

\(Given: (x_1, y_1), (x_2, y_2)...(x_n,y_n) where x_i \in X, \ y_i \in (-1, +1)\)

\(Initialize \ D_1(i) = 1/N\)

\(D_1(i)\) 第一轮权重, N 表示样本数量, i 表示第1轮下的第i个元素

\(For \ t = 1,...T:\)

  • Train week learner using training data weighted according to distribution \(D_t\)

用带权重的数据集, 权值为 \(D_t\) 来训练出一个弱的分类器

  • Get weak hypothesis \(h_t: X \rightarrow (-1, +1)\)

对于每个数据输如, 输出 1 或 -1 (二分类)

  • Measure "goodness" of \(h_t\) by its weighted error with respect to \(D_t\)

如何对模型进行一个评价

\(\epsilon_t = Pr_{i-D_t} [h_i(x_i) \ne y_i] = \sum \limits _{ih_i(x_i) \ne y_i} D_t(i)\)

对预测错误的样本, 的权值 进行一个求和.(误差)

假设有 10个样本, 那每个样本初始权重为 1/10 = 0.1,

如果有5个预测错了, 则 \(\epsilon = 0.1 + 0.1+ ..= 0.5\)

  • if \(\epsilon_t \ge 0.5 \ then \ stop\)
  • Let \(\alpha_t = \frac {1}{2} ln (\frac {1-\epsilon_t}{\epsilon_t})\)

  • Update (更新下一轮数据的权值)

    \(D_{t+1} = \frac {D_t(i)}{Z_t} * [e^{- \alpha_t} if \ y_i=h_i(x_i) \ else \ e^{\alpha_t}]\)

    where \(Z_t\) is a normalization factor (chosen so that \(D_{t+1}\) will be a distribution)

更新每个样本的权值

  • 如果预测对了, 则 乘 \(e^{-a\alpha_t}\) ,即降低该样本权重了
  • 如果预测错了, 则 乘上 \(e^{a\alpha_t}\),即增大该样本权重了
  • 重复上面的过程....

  • Output the final classifier:

    \(H(x) = sign (\sum \limits _{t=1}^T \alpha_t h_t(x))\)

最终预测为, 对每个样本, 在t轮下对应的 \(h_t(x_i) * \alpha_i\) 在求和, 根据 正负号 来判断属于哪个类别.

Adaboost 的证明

Adaboost 训练的模型 H 在训练集上的误差上限为:

\(e^{-2 \sum \limits _{t=1}^T (\frac {1}{2 }-\epsilon_t)^2}\)

假设: \(\epsilon_t = \frac {1}{2}- \gamma_t\) 则误差可写为:

$e^{-2 \sum \limits _{t=1}^T \gamma_t^2} $

后面用到再证吧, 不想证了, 实际意义不是太大

Decision Tree Stumps

在原paper 中, decision tree stump , 是一个 深度为1 的决策树, 非常弱:

\(h(x) = s(1 (x_k \ge t))\)

\(s(x) \in (-1, 1)\)

\(k \in (1,2,....k)\) k is the number of features

一次呢, 只考虑一个 k 值 (一个维度), 非voting

case: Adaboost + Decison tree Stumps

假设样本只有 两个特征 x1, x2 (变量, 非样本哈)

开始:

假设首先是 根据 x1 的值 判断分类,假设共10个数据 分为A,B两拨.

​ 这里呢有A两个分错了:

​ 将分错的 权重 增大; 对的权重减少

然后进入下一轮:

​ 假设根据 x1的某个值分类:

​ 错的 权重增大; 对的权重减小

... 这样下去, 分对的点越来越小, 错误的点, 变大, 然后继续分. (会出现交替变大/变小的情况)

在某种条件下停下来, 然后将其结合起来, 这就相对很准确了.

小结

Adaboost 里面的几个模型是 顺序执行的关系, 它其实是认为, 有些模型是不好的

\(H(x) = sign (\sum \limits _{t=1}^T \alpha_t h_t(x))\)

这个 \(\alpha\) 是对不同的模型有不同赋值, (错误率高则权重减小), 跟样本数据无关哦, 其实就是, 通过前面模型的误差, 来直到后面模型的正确方向呀, 这样, 这样误差就会越来越小, 然后 再组合起来就很强大了. 嗯, 我感觉需要注意的一点是, 虽然强调 h(x) 可以由多个弱分类器组成, 但也要强于 随机猜测:

if \(\epsilon_t \ge 0.5 \ then \ stop\)

然后就是每一轮通过给不同数据的权值, 训练模型, 基于错误的信息调整权重, 最后再做集成, 嗯, 感觉还是从 paper 中, 直观的数学公式会更好理解一波.

猜你喜欢

转载自www.cnblogs.com/chenjieyouge/p/12006352.html
今日推荐