史诗级干货长文集成学习进阶(XGBoost & lightGBM)
Posted ZSYL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了史诗级干货长文集成学习进阶(XGBoost & lightGBM)相关的知识,希望对你有一定的参考价值。
集成学习进阶
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案例介绍
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上开源的⼀个新的梯度提升框架。
在开源之后,就被别⼈冠以“速度惊⼈”、“⽀持分布式”、“代码清晰易懂”、“占用内存小”等属性。
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
- mac下:
link
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.《绝地求生》玩家排名预测
加油!
感谢!
努力!
以上是关于史诗级干货长文集成学习进阶(XGBoost & lightGBM)的主要内容,如果未能解决你的问题,请参考以下文章