XGBoost(Extreme Gradient Boosting)全名叫极端梯度提升树,XGBoost是集成学习⽅法的王牌,在Kaggle数据挖掘 ⽐赛中,⼤部分获胜者⽤了XGBoost。
XGBoost在绝⼤多数的回归和分类问题上表现的⼗分顶尖,本节将较详细的介绍XGBoost的算法原理。
我们在前⾯已经知道,构建最优模型的⼀般⽅法是最⼩化训练数据的损失函数。
我们⽤字⺟ L表示损失,如下式:
其中,F是假设空间
假设空间是在已知属性和属性可能取值的情况下,对所有可能满⾜⽬标的情况的⼀种毫⽆遗漏的假设集合。
应⽤:
⽬标函数,即损失函数,通过最⼩化损失函数来构建最优模型。
由前⾯可知, 损失函数应加上表示模型复杂度的正则项,且XGBoost对应的模型包含了多个CART树,因此,模型的⽬ 标函数为:
(3.1)式是正则化的损失函数;
其中yi是模型的实际输出结果, 是模型的输出结果; yi
等式右边第⼀部分是模型的训练误差,第⼆部分是正则化项,这⾥的正则化项是K棵树的正则化项相加⽽来的。
那么⼀直这样分裂,什么时候才会停⽌呢?
官⽹链接:https://xgboost.readthedocs.io/en/latest/
pip3 install xgboost
请参考:泰坦尼克号乘客生存预测(XGBoost)
请参考:otto案例介绍 – Otto Group Product Classification Challenge【xgboost实现】
lightGBM是2017年1⽉,微软在GItHub上开源的⼀个新的梯度提升框架。
Github链接
在开源之后,就被别⼈冠以“速度惊⼈”、“⽀持分布式”、“代码清晰易懂”、“占用内存小”等属性。
LightGBM主打的高效并行训练让其性能超越现有其他boosting工具。在Higgs数据集上的试验表明,LightGBM比 XGBoost快将近10倍,内存占⽤率⼤约为XGBoost的1/6。
higgs数据集介绍:这是⼀个分类问题,⽤于区分产⽣希格斯玻⾊⼦的信号过程和不产⽣希格斯玻⾊⼦的信号过程。
数据连接
lightGBM 主要基于以下方面优化,提升整体特特性:
具体解释见下,分节介绍。
直方图算法的基本思想是
Eg:
[0, 0.1) --> 0;
[0.1,0.3) --> 1;
…
使用直方图算法有很多优点。首先,最明显就是内存消耗的降低,直方图算法不仅不需要额外存储预排序的结果,而且可以只保存特征离散化后的值,而这个值⼀般⽤8位整型存储就足够了,内存消耗可以降低为原来的1/8。
然后在计算上的代价也大幅降低,预排序算法每遍历⼀个特征值就需要计算⼀次分裂的增益,⽽直⽅图算法只需要计算 k次(k可以认为是常数),时间复杂度从O(#data#feature)优化到O(k#features)。
Level-wise便利⼀次数据可以同时分裂同⼀层的叶子,容易进行多线程优化,也好控制模型复杂度,不容易过拟合。
但实际上Level-wise是⼀种低效的算法,因为它不加区分的对待同⼀层的叶子,带来了很多没必要的开销,因为实际上很多叶子的分裂增益较低,没必要进行搜索和分裂。
Leaf-wise则是⼀种更为高效的策略,每次从当前所有叶⼦中,找到分裂增益最大的⼀个叶子,然后分裂,如此循环。
因此同Level-wise相⽐,在分裂次数相同的情况下,Leaf-wise可以降低更多的误差,得到更好的精度。
Leaf-wise的缺点是可能会⻓出⽐较深的决策树,产⽣过拟合。因此LightGBM在Leaf-wise之上增加了⼀个最⼤深度 的限制,在保证⾼效率的同时防⽌过拟合。
Expo数据集介绍:数据包含1987年10⽉⾄2008年4⽉美国境内所有商业航班的航班到达和离开的详细信息。这是 ⼀个庞⼤的数据集:总共有近1.2亿条记录。主要⽤于预测航班是否准时。
数据链接
LightGBM还具有支持高效并行的优点。LightGBM原生支持并行学习,目前支持特征并行和数据并行的两种。
LightGBM针对这两种并行方法都做了优化:
pip3 install lightgbm
下表对应了 Faster Speed ,better accuracy ,over-fitting 三种目的时,可以调的参数
接下来,通过鸢尾花数据集对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
《绝地求生》玩家排名预测(2万5千字~大型综合实战)
加油!
感谢!
努力!