集成学习

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 ightarrow (-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) e y_i] = sum limits _{ih_i(x_i) e 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^{-aalpha_t}) ,即降低该样本权重了
  • 如果预测错了, 则 乘上 (e^{aalpha_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 中, 直观的数学公式会更好理解一波.

原文地址:https://www.cnblogs.com/chenjieyouge/p/12006352.html