0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

梯度提升方法(Gradient Boosting)算法案例

sekJ_AI_class_v 2019-09-23 08:52 次阅读

GradientBoost算法 python实现,该系列文章主要是对《统计学习方法》的实现。

完整的笔记和代码以上传到Github,地址为(觉得有用的话,欢迎Fork,请给作者个Star):

https://github.com/Vambooo/lihang-dl

提升树利用加法模型与前向分步算法实现学习的优化过程,当损失函数为平方损失和指数损失函数时,每一步优化都较为简单。但对一般损失函数来说,每一步的优化并不容易。Fredman为了解决这一问题,便提出了梯度提升(Gradient Boosting)方法。

梯度提升法利用最速下降的近似方法,这里的关键是利用损失函数的负梯度在当前模型的值r_{mi}作为回归问题提升树算法中的残差的近似值,拟合一个回归树。

梯度提升方法(Gradient Boosting)算法

注:该步通过估计使损失函数极小化的常数值,得到一个根结点的树。

梯度提升方法(Gradient Boosting)算法案例

Gradient Boost算法案例 python实现(马疝病数据)

(代码可以左右滑动看)

import pandas as pdimport numpy as npimportmatplotlib.pyplotaspltfrom sklearn import ensemblefrom sklearn import linear_model

第一步:构建数据

# 创建模拟数据xx = np.arange(0, 60)y=[ x / 2 + (x // 10) % 2 * 20 * x / 5 + np.random.random() * 10 for x in xx]
x = pd.DataFrame({'x': x})
# Plot mock dataplt.figure(figsize=(10, 5))plt.scatter(x, y)plt.show()

线性回归模型来拟合数据

linear_regressor=linear_model.LinearRegression()linear_regressor.fit(x, y)
plt.figure(figsize=(10, 5))plt.title("Linear Regression")plt.scatter(x, y)plt.plot(x, linear_regressor.predict(x), color='r')plt.show()

线性回归模型旨在将预测与实际产出之间的平方误差最小化,从我们的残差模式可以清楚地看出,残差之和约为0:

梯度提升法使用一组串联的决策树来预测y

下面从只有一个估计量的梯度提升回归模型和一个只有深度为1的树开始:

params = {    'n_estimators': 1,    'max_depth': 1,    'learning_rate': 1,    'criterion': 'mse'}
gradient_boosting_regressor = ensemble.GradientBoostingRegressor(**params)
gradient_boosting_regressor.fit(x, y)
plt.figure(figsize=(10, 5))plt.title('Gradient Boosting model (1 estimators, Single tree split)')plt.scatter(x, y)plt.plot(x, gradient_boosting_regressor.predict(x), color='r')plt.show()

从上图可以看到深度1决策树在x<50  和x>50处被拆分,其中:

if x<50 ,y=56;

if x>=50,y=250.

这样的拆分结果肯定是不好的,下面用一个估计量时,30-40之间的残差很。猜想:如果使用两个估计量,把第一棵树的残差输入下一棵树中,有怎样的效果?验证代码如下:

params['n_estimators'] = 2
gradient_boosting_regressor = ensemble.GradientBoostingRegressor(**params)
gradient_boosting_regressor.fit(x, y)
plt.figure(figsize=(10, 5))plt.title('Gradient Boosting model (1 estimators, Single tree split)')plt.scatter(x, y)plt.plot(x, gradient_boosting_regressor.predict(x), color='r')plt.show()

如上图,当有连个估计量时,第二棵树是在30处拆分的,如果我们继续增加估计量,我们得到Y分布的一个越来越接近的近似值:

f, ax = plt.subplots(2, 2, figsize=(15, 10))
for idx, n_estimators in enumerate([5, 10, 20, 50]):    params['n_estimators'] = n_estimators
    gradient_boosting_regressor = ensemble.GradientBoostingRegressor(**params)
    gradient_boosting_regressor.fit(x, y)    subplot = ax[idx // 2][idx % 2]    subplot.set_title('Gradient Boosting model ({} estimators, Single tree split)'.format(n_estimators))    subplot.scatter(x, y)    subplot.plot(x, gradient_boosting_regressor.predict(x), color='r')plt.show()

上面是改变估计量,保持树深度的效果,下面保持估计量为10,改变树的深度.

params['n_estimators'] = 10
f, ax = plt.subplots(2, 2, figsize=(15, 10))
for idx, max_depth in enumerate([1, 2, 3, 5]):    params['max_depth'] = max_depth
    gradient_boosting_regressor = ensemble.GradientBoostingRegressor(**params)
    gradient_boosting_regressor.fit(x, y)    subplot = ax[idx // 2][idx % 2]    subplot.set_title('Gradient Boosting model (10 estimators, {} max tree splits)'.format(max_depth))    subplot.scatter(x, y)    subplot.plot(x, gradient_boosting_regressor.predict(x), color='r')plt.show()

上两图可以看到如何通过增加估计量和最大深度来拟合y值。不过有点过拟合了。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 算法
    +关注

    关注

    23

    文章

    4458

    浏览量

    90763
  • python
    +关注

    关注

    51

    文章

    4678

    浏览量

    83476

原文标题:机器学习笔记系列(十三) | GradientBoost算法 python实现

文章出处:【微信号:AI_class_vip,微信公众号:人工智能学研社】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    《MATLAB优化算法案例分析与应用》

    《MATLAB优化算法案例分析与应用》清华大学出版社《MATLAB优化算法案例分析与应用》这本书,给大家推荐一下这本书清华大学出版社《MATLAB优化算法案例分析与应用》这本书,给大家推荐一下这本书
    发表于 10-10 12:34

    机器学习新手必学的三种优化算法(牛顿法、梯度下降法、最速下降法)

    角度来理解它们。本文介绍的核心算法包括:牛顿法(Newton’s Method)最速下降法(Steep Descent)梯度下降法(Gradient Descent)如果想对这些算法
    发表于 05-07 08:30

    集成学习和Boosting提升方法

    李航《统计学习方法》——第八章Boosting提升方法【补充集成学习】+习题答案
    发表于 06-05 09:49

    梯度更新算法的选择

    深度学习入门(四)梯度更新算法的选择(附执行代码)
    发表于 06-09 11:02

    基础算法案

    基础算法案例1.特殊回文数问题描述:左边往右边看,右边往左边看,都是同一个数叫做回文数,比如19291就是一个回文数,那么我们输入一个两位及以上的数字,返回回文数,案例如下:def is_pal
    发表于 07-23 06:51

    基于多新息随机梯度算法的网侧变流器参数辨识方法研究

    基于多新息随机梯度算法的网侧变流器参数辨识方法研究_张敏
    发表于 01-02 15:24 20次下载

    一种改进的梯度投影算法

    的Barzilai-Borwein (B-B)梯度投影(Barzilai-Borwein Gradient Projection for Sparse Reconstruction,GPSR-BB)算法的基础上,采用预测校正
    发表于 11-27 18:09 0次下载

    机器学习:随机梯度下降和批量梯度下降算法介绍

    随机梯度下降(Stochastic gradient descent) 批量梯度下降(Batch gradient descent) 梯度
    发表于 11-28 04:00 8302次阅读
    机器学习:随机<b class='flag-5'>梯度</b>下降和批量<b class='flag-5'>梯度</b>下降<b class='flag-5'>算法</b>介绍

    一文看懂常用的梯度下降算法

    编辑:祝鑫泉 一 概述 梯度下降算法Gradient Descent Optimization )是神经网络模型训练最常用的优化算法。对于深度学习模型,基本都是采用
    发表于 12-04 18:17 1550次阅读

    改进深度学习算法的光伏出力预测方法

    为提高光伏出力的预测精度,提出了一种改进深度学习算法的光伏出力预测方法。首先,针对传统的深度学习算法采用批量梯度下降(batch gradient
    发表于 12-17 10:42 8次下载
    改进深度学习<b class='flag-5'>算法</b>的光伏出力预测<b class='flag-5'>方法</b>

    GBDT算法原理以及实例理解

    GBDT 的全称是 Gradient Boosting Decision Tree,梯度提升树,在传统机器学习算法中,GBDT算的上TOP3
    的头像 发表于 04-28 16:47 2.8w次阅读
    GBDT<b class='flag-5'>算法</b>原理以及实例理解

    将浅层神经网络作为“弱学习者”的梯度Boosting框架

    1. 简介 本文提出了一种新的梯度Boosting框架,将浅层神经网络作为“弱学习者”。在此框架下,我们考虑一般的损失函数,并给出了分类、回归和排序的具体实例。针对经典梯度boosting
    的头像 发表于 05-03 18:21 2426次阅读
    将浅层神经网络作为“弱学习者”的<b class='flag-5'>梯度</b><b class='flag-5'>Boosting</b>框架

    基于并行Boosting算法的雷达目标跟踪检测系统

    基于并行Boosting算法的雷达目标跟踪检测系统
    发表于 06-30 14:25 31次下载

    基于 Boosting 框架的主流集成算法介绍(上)

    本文是决策树的第三篇,主要介绍基于 Boosting 框架的主流集成算法,包括 XGBoost 和 LightGBM。 XGBoost
    的头像 发表于 02-17 15:57 776次阅读
    基于 <b class='flag-5'>Boosting</b> 框架的主流集成<b class='flag-5'>算法</b>介绍(上)

    基于 Boosting 框架的主流集成算法介绍(中)

    本文是决策树的第三篇,主要介绍基于 Boosting 框架的主流集成算法,包括 XGBoost 和 LightGBM。 XGBoost
    的头像 发表于 02-17 15:58 469次阅读
    基于 <b class='flag-5'>Boosting</b> 框架的主流集成<b class='flag-5'>算法</b>介绍(中)