集成学习 - 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
\(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 中, 直观的数学公式会更好理解一波.