我是谁?布鲁
XGBoost,极限梯度提升树,致力于让提升树突破自身的计算极限,以实现运算快速,性能优秀的工程目标。
方法1:用XGBoost库的建模流程
方法2:用xgboost库中的sklearn的API
可以调用sklearn中惯例的实例化,fit和predict的流程来运行XGBoost,并且也可以调用属性比如coef_等等。
比较:使用xgboost中设定的建模流程来建模,和使用sklearnAPI中的类来建模,模型效果相似,但是xgboost库本身的运算速度(尤其是交叉验证)以及调参手段比sklearn要简单。
XGBoost的三大板块
梯度提升树
集成算法通过在数据上构建多个弱评估器,汇总所有弱评估器的建模结果,以获取比单个模型更好的回归或分类表现。弱评估器被定义为是表现至少比随机猜测更好的模型,即预测准确率不低于50%的任意模型。多以cart树为基础。
梯度提升树,每次构建一棵树,每棵树依赖于前一棵树构建,树与树之间是相关的,最后的预测结果是每棵树预测结果的加权求和。
XGBoost和GBDT的区别:GBDT中预测值是由所有弱分类器上的预测结果的加权求和,其中每个样本上的预测结果就是样本所在的叶子节点的均值。而XGBT中的预测值是所有弱分类器上的叶子权重直接求和得到,计算叶子权重是一个复杂的过程。
参数:树的数量、是否打印
XGBoost实战
导入库、数据集
建模,查看接口和属性
交叉验证,XGBoost与线性回归、随机森林回归对比
发现XGBoost与随机森林相差很小,但XGBoost略优,线性回归表现最差,如果数据再复杂一些XGBoost的优势将会更加明显
XGBoost
随机森林
线性回归
定义绘制以训练样本数为横坐标的学习曲线的函数,可以看到结果是过拟合的。应该把训练集和测试集的结果调的差不多
调参,n_estimators,根据结果,660棵树得到的结果最好,但不需要用到这么多,只需要取拐点位置便可。
以上计算的r2只是计算了模型的偏差而已,在计算泛化误差时,既需要考虑偏差还需要同时考虑方差和随机误差
因而需要重新定义学习曲线,以泛化误差的大小来绘制学习曲线,找到最优参数。
以往直接取学习曲线获得的分数的最高点,也就是考虑偏差最小的点,是因为模型不稳定方差很大的情况比较少见。但在数据量非常少,模型会相对不稳定,因此需要将方差也纳入考虑的范围。
通过找到最小的泛化误差,找到最优的参数n_estimators
找到相对位置150后,细化继续搜索[100,300],基本代码和之前是一样的。
对比几次调参结果,时间和准确率
总结:
第一,XGBoost中树的数量决定了模型的学习能力,树越多,模型学习能力越强,并且XGBoost天生就是过拟合的模型。但数据较少时,模型会变得不稳定;第二,刚开始树增加会很快提高准确率,但到一定限度后增加树提高的准确率很少,并且浪费计算资源;第三,和随机森林不同,随机森林一般会先单调n_estimators,再调其他参数,因为树的数量和准确率是单调递增的,但XGBoost一味的增加树可能会让模型效果反而变差,可能需要与其他参数一起进行网格搜索,但第一个需要调的参数还是n_estimators,一般建议300以下为佳。
参数:有放回随机抽样:subsample,控制自助法抽取的量0-1之间,第一次随机抽样,第二次给对第一次分错的样本权重加大进行抽样,直到第k次抽样,建立第k棵树
subsample参数通常是在样本量本身很大的时候来调整和使用,如果数据本来就比较少,还用subsample,数据更少了,就更容易过拟合了。
先全范围搜索,间隔较大
再细化搜索,并且同时绘制偏差、方差、泛化误差3条线
最终发现,最优的点在1时取到,即在默认值。
参数eta
把找到下一棵树转化为最优化问题,以迭代的方式找到所有树。
因此与梯度下降一样,GBDT也有学习率,也就是eta
评分函数比较不同指标
分别比较学习率为0,0.2,0.5,1情况下,r2和负均方误差。
一般学习率不太需要调整,在[0.01,0.2]之间,默认0.1情况比较理想。