zoukankan      html  css  js  c++  java
  • 集成学习

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

  • 相关阅读:
    在图像中随机更改像素值程序——matlab
    图像频谱图画图——matlab
    图像三维灰度分布图——matlab
    JVM安全退出(如何优雅的关闭java服务)
    annotation(@Retention@Target)详解
    synchronized与static synchronized 的区别
    ExecutorService对象的shutdown()和shutdownNow()的区别
    execute和submit的区别
    Java线程之FutureTask与Future浅析
    Runnable与Callable
  • 原文地址:https://www.cnblogs.com/chenjieyouge/p/12006352.html
Copyright © 2011-2022 走看看