ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【史诗级干货长文】集成学习进阶(XGBoost & lightGBM)

2021-07-26 23:34:54  阅读:365  来源: 互联网

标签:xgboost lightGBM 进阶 1.2 XGBoost test 算法 长文


集成学习进阶

1. xgboost算法原理

XGBoost(Extreme Gradient Boosting)全名叫极端梯度提升树,XGBoost是集成学习⽅法的王牌,在Kaggle数据挖掘 ⽐赛中,⼤部分获胜者⽤了XGBoost。

XGBoost在绝⼤多数的回归和分类问题上表现的⼗分顶尖,本节将较详细的介绍XGBoost的算法原理。

1.1 最优模型的构建方法

我们在前⾯已经知道,构建最优模型的⼀般⽅法是最⼩化训练数据的损失函数。

我们⽤字⺟ L表示损失,如下式:

在这里插入图片描述

其中,F是假设空间
假设空间是在已知属性和属性可能取值的情况下,对所有可能满⾜⽬标的情况的⼀种毫⽆遗漏的假设集合。

在这里插入图片描述
应⽤:

  • 决策树的⽣成和剪枝分别对应了经验⻛险最⼩化和结构⻛险最⼩化,
  • XGBoost的决策树⽣成是结构⻛险最⼩化的结果,后续会详细介绍。

1.2 XGBoost的目标函数推导

1.2.1 目标函数确定

⽬标函数,即损失函数,通过最⼩化损失函数来构建最优模型。

由前⾯可知, 损失函数应加上表示模型复杂度的正则项,且XGBoost对应的模型包含了多个CART树,因此,模型的⽬ 标函数为:

在这里插入图片描述

(3.1)式是正则化的损失函数;
其中yi是模型的实际输出结果, 是模型的输出结果; yi
等式右边第⼀部分是模型的训练误差,第⼆部分是正则化项,这⾥的正则化项是K棵树的正则化项相加⽽来的。

1.2.2 CART树的介绍

在这里插入图片描述

1.2.3 树的复杂度定义

1.2.3.1 定义每课树的复杂度

在这里插入图片描述

1.2.3.2 树的复杂度举例

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2.4 目标函数推导

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.3 XGBoost的回归树构建方法

1.3.1 计算分裂节点

在这里插入图片描述
那么⼀直这样分裂,什么时候才会停⽌呢?

1.3.2 停⽌分裂条件判断

在这里插入图片描述

1.4 XGBoost与GDBT的区别

在这里插入图片描述

2. xgboost算法api介绍

2.1 xgboost的安装

官⽹链接:https://xgboost.readthedocs.io/en/latest/

pip3 install xgboost

2.2 xgboost参数介绍

在这里插入图片描述

2.2.1 通⽤参数(general parameters)

在这里插入图片描述

2.2.2 Booster 参数(booster parameters)

2.2.2.1 Parameters for Tree Booster

在这里插入图片描述

2.2.3 学习目标参数(task parameters)

在这里插入图片描述

3. xgboost案例介绍

请参考泰坦尼克号乘客生存预测(XGBoost)

4. otto案例介绍 – Otto Group Product Classification Challenge【xgboost实现】

请参考otto案例介绍 – Otto Group Product Classification Challenge【xgboost实现】

5. lightGBM

5.1 写在介绍lightGBM之前

5.1.1 lightGBM演进过程

在这里插入图片描述

5.1.2 AdaBoost算法

在这里插入图片描述

5.1.3 GBDT算法以及优缺点

在这里插入图片描述
在这里插入图片描述

5.1.4 启发

在这里插入图片描述

5.2 什么是lightGBM

lightGBM是2017年1⽉,微软在GItHub上开源的⼀个新的梯度提升框架。

Github链接

在开源之后,就被别⼈冠以“速度惊⼈”、“⽀持分布式”、“代码清晰易懂”、“占用内存小”等属性。

LightGBM主打的高效并行训练让其性能超越现有其他boosting工具。在Higgs数据集上的试验表明,LightGBM比 XGBoost快将近10倍,内存占⽤率⼤约为XGBoost的1/6。

higgs数据集介绍:这是⼀个分类问题,⽤于区分产⽣希格斯玻⾊⼦的信号过程和不产⽣希格斯玻⾊⼦的信号过程。

数据连接

5.3 lightGBM原理

lightGBM 主要基于以下方面优化,提升整体特特性:

  • 1.基于Histogram(直⽅图)的决策树算法
  • 2.Lightgbm 的Histogram(直⽅图)做差加速
  • 3.带深度限制的Leaf-wise的叶⼦生长策略
  • 4.直接⽀持类别特征
  • 5.直接⽀持高效并行

具体解释见下,分节介绍。

5.3.1 基于Histogram(直⽅图)的决策树算法

直方图算法的基本思想是

  • 先把连续的浮点特征值离散化成k个整数,同时构造⼀个宽度为k的直方图。
  • 在遍历数据的时候,根据离散化后的值作为索引在直方图中累积统计量,当遍历⼀次数据后,直⽅图累积了需要的 统计量,然后根据直⽅图的离散值,遍历寻找最优的分割点。

Eg:
[0, 0.1) --> 0;
[0.1,0.3) --> 1;

在这里插入图片描述
使用直方图算法有很多优点。首先,最明显就是内存消耗的降低,直方图算法不仅不需要额外存储预排序的结果,而且可以只保存特征离散化后的值,而这个值⼀般⽤8位整型存储就足够了,内存消耗可以降低为原来的1/8。

在这里插入图片描述

然后在计算上的代价也大幅降低,预排序算法每遍历⼀个特征值就需要计算⼀次分裂的增益,⽽直⽅图算法只需要计算 k次(k可以认为是常数),时间复杂度从O(#data#feature)优化到O(k#features)。

在这里插入图片描述

5.3.2 Lightgbm 的Histogram(直⽅图)做差加速

在这里插入图片描述

5.3.3 带深度限制的Leaf-wise的叶子生长策略

Level-wise便利⼀次数据可以同时分裂同⼀层的叶子,容易进行多线程优化,也好控制模型复杂度,不容易过拟合。

  • 但实际上Level-wise是⼀种低效的算法,因为它不加区分的对待同⼀层的叶子,带来了很多没必要的开销,因为实际上很多叶子的分裂增益较低,没必要进行搜索和分裂。
    在这里插入图片描述
    Leaf-wise则是⼀种更为高效的策略,每次从当前所有叶⼦中,找到分裂增益最大的⼀个叶子,然后分裂,如此循环。

  • 因此同Level-wise相⽐,在分裂次数相同的情况下,Leaf-wise可以降低更多的误差,得到更好的精度。

  • Leaf-wise的缺点是可能会⻓出⽐较深的决策树,产⽣过拟合。因此LightGBM在Leaf-wise之上增加了⼀个最⼤深度 的限制,在保证⾼效率的同时防⽌过拟合。

在这里插入图片描述

5.3.4 直接支持类别特征

在这里插入图片描述

Expo数据集介绍:数据包含1987年10⽉⾄2008年4⽉美国境内所有商业航班的航班到达和离开的详细信息。这是 ⼀个庞⼤的数据集:总共有近1.2亿条记录。主要⽤于预测航班是否准时。
数据链接

5.3.5 直接支持高效并行

LightGBM还具有支持高效并行的优点。LightGBM原生支持并行学习,目前支持特征并行和数据并行的两种。

  • 特征并行的主要思想是在不同机器在不同的特征集合上分别寻找最优的分割点,然后在机器间同步最优的分割点。
  • 数据并行则是让不同的机器先在本地构造直方图,然后进行全局的合并,最后在合并的直⽅图上⾯寻找最优分割点。

LightGBM针对这两种并行方法都做了优化:

  • 在特征并行算法中,通过在本地保存全部数据避免对数据切分结果的通信;

在这里插入图片描述

  • 在数据并中使⽤分散规约 (Reduce scatter) 把直⽅图合并的任务分摊到不同的机器,降低通信和计算,并利用直方图做差,进⼀步减少了⼀半的通信量。

在这里插入图片描述

  • 基于投票的数据并行(Voting Parallelization)则进⼀步优化数据并行中的通信代价,使通信代价变成常数级别。在数据量很大的时候,使⽤投票并行可以得到非常好的加速效果。

在这里插入图片描述

5.4 小结

在这里插入图片描述

6. lightGBM算法api介绍

6.1 lightGBM的安装

  • windows下:
pip3 install lightgbm

6.2 lightGBM参数介绍

6.2.1 Control Parameters

在这里插入图片描述

6.2.2 Core Parameters

在这里插入图片描述在这里插入图片描述

6.2.3 IO parameter

在这里插入图片描述

6.3 调参建议

在这里插入图片描述
下表对应了 Faster Speed ,better accuracy ,over-fitting 三种目的时,可以调的参数

在这里插入图片描述在这里插入图片描述

7. lightGBM案例介绍

接下来,通过鸢尾花数据集对lightGBM的基本使⽤,做⼀个介绍。

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import mean_absolute_error
import lightgbm as lgb

加载数据,对数据进行基本处理

iris = load_iris()
data = iris.data
target = iris.target
x_train, x_test, y_train, y_test = train_test_split(data, target, test_size=0.2)

在这里插入图片描述

target

在这里插入图片描述
模型训练

gbm = lgb.LGBMRegressor(objective='regression', learning_rate=0.05, n_estimators=20)

gbm.fit(x_train, y_train, eval_set=[(x_test, y_test)], eval_metric='l1', early_stopping_rounds=5)  # early_stopping_rounds:涨的的话,那就是最多5次,后终止
gbm.score(x_test, y_test)

在这里插入图片描述
在这里插入图片描述
网格搜索,参数优化

estimators = lgb.LGBMRegressor(num_leaves=31)
param_grid = {
    'learning_rate': [0.01, 0.1, 1],
    'n_estimators': [20, 40, 60, 80]
}
gbm = GridSearchCV(estimators, param_grid, cv=5)
gbm.fit(x_train, y_train)

在这里插入图片描述
模型调优训练

gbm = lgb.LGBMRegressor(objective='regression', learning_rate=0.1, n_estimators=20)

gbm.fit(x_train, y_train, eval_set=[(x_test, y_test)], eval_metric='l1', early_stopping_rounds=3)  # early_stopping_rounds:涨的的话,那就是最多5次,后终止
gbm.score(x_test, y_test)

在这里插入图片描述

0.8084908368174917

8.《绝地求生》玩家排名预测

《绝地求生》玩家排名预测(2万5千字~大型综合实战)

加油!

感谢!

努力!

标签:xgboost,lightGBM,进阶,1.2,XGBoost,test,算法,长文
来源: https://blog.csdn.net/qq_46092061/article/details/119118268

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有