1.1 xgboost库
使用import xgboost as xgb导入XGB相关的类,并使用xgboost库建立自己的建模流程。
最核心的是DMatrix和train,DMatrix是读取数据的类,train是用于训练的类。与sklearn把所有的参数都写在类中的方式不同,xgboost库中必须先使用字典设定参数集param,再使用train来将参数导入,然后在进行训练。会这样设计是因为xgb涉及到的参数太多,全部写在xgb.train()中太长容易出错。下面是params可能的取值以及xgboost.train的列表
params {eta, gamma, max_depth, min_child_weight, max_delta_step, subsample, colsample_bytree,colsample_bylevel, colsample_bynode, lambda, alpha, tree_method string, sketch_eps, scale_pos_weight, updater,refresh_leaf, process_type, grow_policy, max_leaves, max_bin, predictor, num_parallel_tree}
xgboost.train (params, dtrain, num_boost_round=10, evals=(), obj=None, feval=None, maximize=False, early_stopping_rounds= None, evals_result=None, verbose_eval=True, xgb_model=None, callbacks=None,learning_rates=None)
1.2 XGB的sklearn API
我们可以调用如下的类,并用我们sklearn当中惯例的实例化,fit和predict的流程来运行XGB,并且也可以调用属性比如coef_等等。当然,这是我们回归的类,我们也有用于分类,用于排序的类。他们与回归的类非常相似,因此了解一个类即可。
class xgboost.XGBRegressor (max_depth=3, learning_rate=0.1, n_estimators=100,silent= True,objective='reg:linear', booster='gbtree', n_jobs=1, nthread=None, gamma=0, min_child_weight=1, max_delta_step=0,subsample=1, colsample_bytree=1,colsample_bylevel =1, reg_alpha=0, reg_lambda=1, scale_pos_weight=1,base_score=0.5, random_state=0, seed=None, missing=None, importance_type='gain', **kwargs)
xgboost.train和sklearnAPI中的XGBRegressor需要输入的参数名是不同的,但是功能是相同的,比如说,我们的params字典中的第一个参数eta,其实就是我们XGBRegressor里面的参数learning_rate,他们的含义和实现的功能是一模一样的。
使用xgboost中设定建模流程来建模,和使用sklearnAPI的类来建模,模型效果是比较相似的,但是xgboost库本身的运算速度(尤其是交叉验证)以及调参手段比sklearn要简单。
1.3 XGBoost的三大板块
XGBoost本身的核心是基于梯度提升数实现的集成算法,整体来说可以有三个核心的部分:集成算法本身,用于集成的弱评估器,以及应用中的其他过程。
1.4 梯度提升树
XGBoost的基础是梯度提升算法,梯度提升(Gradient boosting)是构建预测模型的最强大技术之一,它是集成算法boosting的代表算法,提升法是逐一构建弱评估器,经过多次迭代积累多个弱评估器,然后汇总所有弱评估器的建模结果,以获取比单个模型更好的回归或分类表现。弱评估器被定义为表现至少比随机猜测更好的模型,即预测的准确率不低于50%的任意模型。梯度提升树中可以有回归树也可以有分类树,两者都以CART树算法作为主流,XGBoost背后也是CART树,这意味着XGBoost中所有的树都是二叉的。接下来,我们就以梯度提升回归树为例子,来了解一下Boosting算法是怎样工作的。
梯度提升回归树是专注于回归的树模型的提升集成模型,其建模过程大致如下:最开始先建立一棵树,然后逐渐迭代,每次迭代过程中都增加一棵树,逐渐形成众多树模型集成的评估器。
对于决策树而言,每个被放到模型的任意样本i最终都会落到一个叶子节点上,而对于回归树,每个叶子节点上的值是这个叶子节点上所有样本的均值。
对于梯度提升回归树来说,每个样本的预测结果表示为所有树上的结果的加权求和:
值得注意的是,XGB作为GBDT的改进,在上却是不同,对XGB来说,每个叶子节点上会有一个预测分数,也成为叶子权重,这个叶子权重就是所有在这个叶子节点上的样本在这个一棵树上的回归取值,用()或是w来表示,其中表示第k棵决策树,表示样本 i 对应的特征向量。当只有一棵树的时候,()就是提示集成算法返回的结果,但是这个结果往往很差。当有多棵树的时候,集成模型的回归结果就是对所有的树的预测分数之和,假设这个集成模型有K棵决策树,则整个模型再这个样本 i 上给出的预测结果为
XGB vs GBDT 核心区别1:求解预测值的方式不同: GBDT中预测值是所有弱分类器上的预测结果的加权求和,其中每个样本上预测结果就是样本所在的椰子节点上的均值。而XGB中的预测值是所有弱分类器上的叶子节点权重直接求和得到,计算叶子权重是一个复杂的过程。
从上面的式子看,超参数K,究竟要建多少棵树?