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_r\sum_{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_r\sum_{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)}\right]_{F(x)=F_{m-1}(x)}$

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

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

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

计算$r_m=argmin_r\sum_{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

Gradient boosting的更多相关文章

  1. Gradient Boosting Decision Tree学习

    Gradient Boosting Decision Tree,即梯度提升树,简称GBDT,也叫GBRT(Gradient Boosting Regression Tree),也称为Multiple ...

  2. A Gentle Introduction to the Gradient Boosting Algorithm for Machine Learning

    A Gentle Introduction to the Gradient Boosting Algorithm for Machine Learning by Jason Brownlee on S ...

  3. How to Configure the Gradient Boosting Algorithm

    How to Configure the Gradient Boosting Algorithm by Jason Brownlee on September 12, 2016 in XGBoost ...

  4. Ensemble Learning 之 Gradient Boosting 与 GBDT

    之前一篇写了关于基于权重的 Boosting 方法 Adaboost,本文主要讲述 Boosting 的另一种形式 Gradient Boosting ,在 Adaboost 中样本权重随着分类正确与 ...

  5. GBDT(Gradient Boosting Decision Tree)算法&协同过滤算法

    GBDT(Gradient Boosting Decision Tree)算法参考:http://blog.csdn.net/dark_scope/article/details/24863289 理 ...

  6. 机器学习中的数学(3)-模型组合(Model Combining)之Boosting与Gradient Boosting

    版权声明: 本文由LeftNotEasy发布于http://leftnoteasy.cnblogs.com, 本文可以被全部的转载或者部分使用,但请注明出处,如果有问题,请联系wheeleast@gm ...

  7. Jackknife,Bootstraping, bagging, boosting, AdaBoosting, Rand forest 和 gradient boosting的区别

    引自http://blog.csdn.net/xianlingmao/article/details/7712217 Jackknife,Bootstraping, bagging, boosting ...

  8. 模型组合(Model Combining)之Boosting与Gradient Boosting

    版权声明: 本文由LeftNotEasy发布于http://leftnoteasy.cnblogs.com, 本文可以被全部的转载或者部分使用,但请注明出处,如果有问题,请联系wheeleast@gm ...

  9. Gradient Boosting, Decision Trees and XGBoost with CUDA ——GPU加速5-6倍

    xgboost的可以参考:https://xgboost.readthedocs.io/en/latest/gpu/index.html 整体看加速5-6倍的样子. Gradient Boosting ...

随机推荐

  1. C语言学习笔记frist---输入两个数比较大小

    C#学习中,问道艰辛,今自C学起,第一个函数学习:输入两个数比较大小,仅作练习: #include "stdafx.h" #include<stdio.h> // 包含 ...

  2. 使用StackTrace堆栈跟踪记录详细日志(可获取行号)

    上一篇我们提到使用.NET自带的TraceSource实现简单的日志,具体请看<轻松背后的N+疲惫——系统日志>,这一篇注意想讲的是日志的详细记录,包含请求开始到结束的过程中调用的方法链以 ...

  3. 在Azure Cloud Service中部署Java Web App(1)

    Microsoft Azure是一个开放的,灵活的云平台,除了对自家的.Net平台有良好的支持外,对于各种开源的软件,语言,工具,框架都有着良好的支持,比如Java,Php,Python等等,你可以使 ...

  4. js为数字添加千位分隔符

    1.字符串处理比较复杂 function test(str){   var iNum = str.length % 3;   var prev = '';   var iNow = 0;   var ...

  5. android TextView EditTextView一些技巧使用 (视图代码布局)

    android TextView 是最常用的控件 可以用作普通的显示,还可以用作有显示文字的按钮,用作有显示图片的图文组合 1. 图文组合 xml 中: <TextView android:id ...

  6. perl 实现微信简版<2>

    <pre name="code" class="python">use LWP::UserAgent; use URI::Escape; use N ...

  7. 重写 libev 的 EV_WIN32_HANDLE_TO_FD

    libev 的 EV_WIN32_HANDLE_TO_FD 默认实现是调用C库的  _open_osfhandle ,但这里有个问题是转换后,关闭 fd 就默认关闭了 handle.当它遇到 libc ...

  8. OpenSSL win 下报错 OPENSSL_Uplink(58D46000,08): no OPENSSL_Applink

    python 中使用 M2Crypto 想读写文件时总是报: OPENSSL_Uplink(58D46000,08): no OPENSSL_Applink windows 平台下使用 openssl ...

  9. Xcode8 注释快捷键无效, 解决方案

    这个是因为苹果解决xcode ghost.把插件屏蔽了.解决方法命令运行: sudo /usr/libexec/xpccachectl 然后必须重启电脑后生效    

  10. Hibernate问题之'hibernate.dialect' not set

    继前文:Hibernate4中buildSessionFactory方法废弃问题.后 继续有问题.本来之前好好的项目,用了这种新的方法后发现问题. 出现  Connection cannot be n ...