zoukankan      html  css  js  c++  java
  • Gradient boosting

    Gradient boosting

    gradient boosting 是一种boosting(组合弱学习器得到强学习器)算法中的一种,可以把学习算法(logistic regression,decision tree)代入其中。

    问题描述:

    给定一组数据{(x,y)}i,i=1,2...,N,使用函数F(x)对数据进行拟合,使对于给定损失函数L(y,F(x))最小

    (损失函数可以为$(y-F(x))^2,|y-F(x)|$[regression],$log(1+e^{-2yF})$[classification])

    使用$F(x)=F_0(x)+sum_{m=1}^{M}r_ih_m(x;alpha_m)$(1)

         $F_0(x)=argmin_rsum_{i=1}^N L(y_i,r)$为初始值;为常数;$r_i$为权重

         $h_m(x;alpha_m)$是某个弱学习算法(logistic regression,decision tree),$alpha_m$为算法的参数

    算法描述:

    首先选取一个常数作为F(x)的估计,最优的常数需要使损失函数最小

    1.初始化$F_0(x)=argmin_rsum_{i=1}^N L(y_i,r)$

    现在已经有了$F_0(x)$作为$F(x)$的初始估计,考虑使用gredient decent方法,使损失函数减少

      A.选取方向$g_m=-left[frac{partial L(y,F(x))}{partial F(x)} ight]_{F(x)=F_{m-1}(x)}$

      B.选取方向后,选取步长,$eta_m=argmin_{eta}sum_{i=1}^{N}L(y_i,F_{m-1}(x_i)+eta g_m)$

    对照(1)式,$g_m$(称为残差,residual)即为$h_m(x;alpha_m)$;$eta_m$即为$r_m$

    2.计算$g_m$,使用$h_m(x;alpha_m)$拟合${x,g_m}_1^N$,得到参数$alpha_m$和$h_m(x)$的值

       计算$r_m=argmin_rsum_{i=1}^{N}L(y_i,F_{m-1}(x_i)+rh_m(x))$

    3.更新$F_m(x)=F_{m-1}(x)+r_mh_m(x)$

    4.循环2,3两步,得到F_M(x)

    输出:算法结束后,得到以下参数$(r_0,r_1,r_2,...,r_M,alpha_1,alpha_2,...,alpha_M)$

    当作预测时:$F(c)=r_0+sum_{i=1}^{M}r_ih_i(c;alpha_i)$

    Demo(程序数据) matlab

    程序中使用:

    损失函数   $L(y,F(x))=frac{1}{N}sum_{i=1}{N}(y_i-F(x_i))^2$

    弱学习算法  spline regression 参看Intro_to_splines(实际就是加了特征转换的regression)

    注意:程序中的predict实现是错误的;程序没有计算步长$r_m$,而是使用常数

    for i=1:nboost
        % 计算残差g_m,residual
        gradient = -2/nTrain * (f-y);
        
        % 用h_m拟合{(x,g_m)}
        submodel = boostedModel(X,gradient,options);
    
        % 作者实现中,对每个特征生成一个spline regression,下列代码选出表现最好的特征
        diff = (submodel - Y).^2;
        err = sum(diff,1)/nTrain;
        best(i) = find( err == min(err));
        f_i = submodel(:,best(i));
        % 如果需要预测,需要保存 spline regression 的两个参数,
        % 特征i和参数alpha(regression每个特征上的权重)
        %
        % 以及训练spline regression时用的knote及Degree参数
    
        % 没有计算步长(权重),直接使用常数,1-500次循环时,v=0.9
        if i>500
            v = 0.5;
        end
        %更新F_m(x)
        f = f + v*f_i;
        
        if mod(i,100) == 0
            n = n+1;
            error(n) = 1/nTrain * sum((y - f).^2);
        end
    
    end
  • 相关阅读:
    leetcode 343. Integer Break(dp或数学推导)
    leetcode 237. Delete Node in a Linked List
    msdtc不可用
    常用反编译软件
    重建索引
    JAVA知识库
    DATAGRID显示序号
    VFLEXGRID8控件注册
    黑马2017年java就业班全套视频教程
    mybatis从入门到精通
  • 原文地址:https://www.cnblogs.com/porco/p/4362920.html
Copyright © 2011-2022 走看看