Python机器学习之XGBoost从入门到实战(基本理论说明)

Xgboost从基础到实战

XGBoost:eXtreme Gradient Boosting
    * 应用机器学习领域的一个强有力的工具
    * Gradient Booting Machines(GBM)的优化表现,快速有效
        —深盟分布式机器学习开源平台(Distributed machine learning Community,DMLC)的分支
        —DMLC也开源流行的深度学习库mxnet
    * GBM:
        Machine:机器学习模型-对数据的产生规律建模
        Boosting Machines:弱学习器组合成强学习器/模型
        Gradient Booting Machines:根据梯度下降方式组合弱学习器

Machines:
    Machines:机器学习模型,建模数据产生规律--最小化目标函数
    目标函数通常包括两个部分:
        * 损失函数:与任务相关(选择和训练数据匹配的最好模型)
            ** 回归:残差平方
            ** 分类:0-1损失、logistic损失、合叶损失(SVM)
        *正则项:与模型复杂度有关(选择最简单的模型)
            L0、L1、L2正则项
            L1会趋向于产生少量的特征,而其他的特征都是0,而L2会选择更多的特征,这些特征都会接近于0。L1在特征选择时候非常有用,而L2就只是一种规则化而已。
Boosting Machines
    * Boosting:价格弱学习器组合成强学习器
    * 弱学习器;比随机猜测性能好的学习器
    * 常用弱学习器:决策树/分类回归树
        决策树:每个叶子节点对应一个决策
        分类回归树:每个叶子节点有个预测分数(score),比决策树更加的灵活
    * Adaptive Boosting(AdaBoost):第一个Boosting算法,最初应用于人脸识别,现在这个工具基本上用于机器学习
        弱分类器:只有一个分裂的决策树
        对于当前分类器不能处理的样本,增加其权重
        不断的加入新的弱学习器,知道达到终止条件(强学习器:弱学习器的加权线性组合,权重与其正确率有关)
Gradient Boosting Machine(GBM)
    * Friedman将AdaBoost推广到一般Gradient Booting框架,得到Gradient Booting Machines(GBM):将Booting视作一个数值优化问题,采用类似梯度下降的方式优化求解
        也被称为stage-wise additive model:每次增加一个弱分类器到已有模型,已在模型中的弱学习器不在变化
        这种推广使得我们可以使用可微的损失函数,从而支持的任务从两类分类扩展到回归和多类分类问题。
XGBoost的特别之处:
    * 正则化:以“正则化提升(regularized booting )”著称
        -标准GBM的实现没有显式的正则化步骤
        -正则化对减少过拟合有帮助
    * 并行处理,相比GBM有了速度的飞跃
        -借助OpenMP,自动将单机CPU的多核进行并行计算
        -支持GPU加速
        -支持分布式
    * 高度的灵活性:允许用户自定义优化目标和评级标准
        -只需要损失函数的一阶导数和二阶导数
    * 剪枝
        -当新增分裂带来负增益时,GBM会停止分裂
        -XGBoost一直分裂到指定的最大深度(max_depth),然后回头来剪枝
    * 内置交叉验证
        -XGBoost允许子在每一轮Boosting迭代中使用交叉验证->可以方便的获得Boosting迭代次数
        -GBM使用网格搜索,只能检测有限个值
    * 在线学习;XGBoost和GBM都支持
XGBoost的优势
    执行速度:确实比其他Gradient boosting实现快
    模型性能:在结构化数据集上,在分类/回归/排序预测建模上表现突出
如何使用?
    处理流程:
        训练数据读取-->数据导入(设置训练参数(超参数))-->模型训练-->模型评估(如果效果不好要转换到第二步骤)
        注意:训练数据要进行特征变换一.xgboost的优点

1.正则化
    xgboost在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。从Bias-variance tradeoff角度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合,这也是xgboost优于传统GBDT的一个特性。
2.并行处理
    xgboost工具支持并行。boosting不是一种串行的结构吗?怎么并行的?注意xgboost的并行不是tree粒度的并行,xgboost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。xgboost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。

3.灵活性
    xgboost支持用户自定义目标函数和评估函数,只要目标函数二阶可导就行。
4.缺失值的处理
    对于特征的值有缺失的样本,xgboost可以自动学习出它的分裂方向

5.剪枝
    XGBoost 先从顶到底建立所有可以建立的子树,再从底到顶反向进行剪枝。比起GBM,这样不容易陷入局部最优解
6.内置交叉验证
    xgb.cv() 是不是感觉很方便

二.xgboost的参数 

    *XGBoost的参数可以分为三种类型:通用参数、booster参数以及学习目标参数

        ** General Parameters:参数控制在提升(boosting)过程中使用哪种booster,常用的booster有树模型(tree)和线性模型(linear model)。
        ** Booster parameters:这取决于使用哪种booster。
        ** Learning Task parameters:控制学习的场景,例如在回归问题中会使用不同的参数控制排序。
        ** 除了以上参数还可能有其它参数,在命令行中使用
    * General Parameters

        ** booster [default=gbtree] 
            *** 有两中模型可以选择gbtree和gblinear。gbtree使用基于树的模型进行提升计算,gblinear使用线性模型进行提升计算。缺省值为gbtree
        ** silent [default=0] 
            *** 取0时表示打印出运行时信息,取1时表示以缄默方式运行,不打印运行时信息。缺省值为0
            *** 建议取0,过程中的输出数据有助于理解模型以及调参。另外实际上我设置其为1也通常无法缄默运行。。
        ** nthread [default to maximum number of threads available if not set] 
            *** XGBoost运行时的线程数。缺省值是当前系统可以获得的最大线程数
            *** 如果你希望以最大速度运行,建议不设置这个参数,模型将自动获得最大线程
        ** num_pbuffer [set automatically by xgboost, no need to be set by user] 
            *** size of prediction buffer, normally set to number of training instances. The buffers are used to save the prediction results of last boosting step.
        ** num_feature [set automatically by xgboost, no need to be set by user] 
            *** boosting过程中用到的特征维数,设置为特征个数。XGBoost会自动设置,不需要手工设置
    * Booster Parameters

        ** From xgboost-unity, the bst: prefix is no longer needed for booster parameters. Parameter with or without bst: prefix will be equivalent(i.e. both bst:eta and eta will be valid parameter setting) .

    * Parameter for Tree Booster

        ** eta [default=0.3] 
            *** 为了防止过拟合,更新过程中用到的收缩步长。在每次提升计算之后,算法会直接获得新特征的权重。 eta通过缩减特征的权重使提升计算过程更加保守。缺省值为0.3
            *** 取值范围为:[0,1]
            *** 通常最后设置eta为0.01~0.2
        ** gamma [default=0] 
            *** minimum loss reduction required to make a further partition on a leaf node of the tree. the larger, the more conservative the algorithm will be.
            *** range: [0,∞]
            *** 模型在默认情况下,对于一个节点的划分只有在其loss function 得到结果大于0的情况下才进行,而gamma 给定了所需的最低loss function的值
            *** gamma值是的算法更conservation,且其值依赖于loss function ,在模型中应该进行调参。
        ** max_depth [default=6] 
            *** 数的最大深度。缺省值为6
            *** 取值范围为:[1,∞]
            *** 指树的最大深度
            *** 树的深度越大,则对数据的拟合程度越高(过拟合程度也越高)。即该参数也是控制过拟合
            *** 建议通过交叉验证(xgb.cv ) 进行调参
            *** 通常取值:3-10
        ** min_child_weight [default=1] 
            *** 孩子节点中最小的样本权重和。如果一个叶子节点的样本权重和小于min_child_weight则拆分过程结束。在现行回归模型中,这个参数是指建立每个模型所需要的最小样本数。该成熟越大算法越conservative。即调大这个参数能够控制过拟合。
            *** 取值范围为: [0,∞]
        ** max_delta_step [default=0] 
            *** Maximum delta step we allow each tree’s weight estimation to be. If the value is set to 0, it means there is no constraint. If it is set to a positive value, it can help making the update step more conservative. Usually this parameter is not needed, but it might help in logistic regression when class is extremely imbalanced. Set it to value of 1-10 might help control the update
            *** 取值范围为:[0,∞]
            *** 如果取值为0,那么意味着无限制。如果取为正数,则其使得xgboost更新过程更加保守。
            *** 通常不需要设置这个值,但在使用logistics 回归时,若类别极度不平衡,则调整该参数可能有效果
        ** subsample [default=1] 
            *** 用于训练模型的子样本占整个样本集合的比例。如果设置为0.5则意味着XGBoost将随机的冲整个样本集合中随机的抽取出50%的子样本建立树模型,这能够防止过拟合。
            *** 取值范围为:(0,1]
        ** colsample_bytree [default=1] 
            *** 在建立树时对特征随机采样的比例。缺省值为1
            *** 取值范围:(0,1]
        ** colsample_bylevel[default=1]
            *** 决定每次节点划分时子样例的比例
            *** 通常不使用,因为subsample和colsample_bytree已经可以起到相同的作用了
        ** scale_pos_weight[default=0]
            *** A value greater than 0 can be used in case of high class imbalance as it helps in faster convergence.
            *** 大于0的取值可以处理类别不平衡的情况。帮助模型更快收敛
    * Parameter for Linear Booster

        ** lambda [default=0] 
            *** L2 正则的惩罚系数
            *** 用于处理XGBoost的正则化部分。通常不使用,但可以用来降低过拟合
        ** alpha [default=0] 
            *** L1 正则的惩罚系数
            *** 当数据维度极高时可以使用,使得算法运行更快。
        ** lambda_bias 
            *** 在偏置上的L2正则。缺省值为0(在L1上没有偏置项的正则,因为L1时偏置不重要)
    * Task Parameters

        ** objective [ default=reg:linear ] 
            *** 定义学习任务及相应的学习目标,可选的目标函数如下:
            *** “reg:linear” –线性回归。
            *** “reg:logistic” –逻辑回归。
            *** “binary:logistic” –二分类的逻辑回归问题,输出为概率。
            *** “binary:logitraw” –二分类的逻辑回归问题,输出的结果为wTx。
            *** “count:poisson” –计数问题的poisson回归,输出结果为poisson分布。
            *** 在poisson回归中,max_delta_step的缺省值为0.7。(used to safeguard optimization)
            *** “multi:softmax” –让XGBoost采用softmax目标函数处理多分类问题,同时需要设置参数num_class(类别个数)
            *** “multi:softprob” –和softmax一样,但是输出的是ndata*nclass的向量,可以将该向量reshape成ndata行nclass列的矩阵。没行数据表示样本所属于每个类别的概率。
            *** “rank:pairwise” –set XGBoost to do ranking task by minimizing the pairwise loss
        ** base_score [ default=0.5 ] 
            *** the initial prediction score of all instances, global bias
        ** eval_metric [ default according to objective ] 
            *** 校验数据所需要的评价指标,不同的目标函数将会有缺省的评价指标(rmse for regression, and error for classification, mean average precision for ranking)
            *** 用户可以添加多种评价指标,对于Python用户要以list传递参数对给程序,而不是map参数list参数不会覆盖’eval_metric’
            *** The choices are listed below:
            *** “rmse”: root mean square error
            *** “logloss”: negative log-likelihood
            *** “error”: Binary classification error rate. It is calculated as #(wrong cases)/#(all cases). For the predictions, the evaluation will regard the instances with prediction value larger than 0.5 as positive instances, and the others as negative instances.
            *** “merror”: Multiclass classification error rate. It is calculated as #(wrong cases)/#(all cases).
            *** “mlogloss”: Multiclass logloss
            *** “auc”: Area under the curve for ranking evaluation.
            *** “ndcg”:Normalized Discounted Cumulative Gain
            *** “map”:Mean average precision
            *** “ndcg@n”,”map@n”: n can be assigned as an integer to cut off the top positions in the lists for evaluation.
            *** “ndcg-“,”map-“,”ndcg@n-“,”map@n-“: In XGBoost, NDCG and MAP will evaluate the score of a list without any positive samples as 1. By adding “-” in the evaluation metric XGBoost will evaluate these score as 0 to be consistent under some conditions. training repeatively
        ** seed [ default=0 ] 
            *** 随机数的种子。缺省值为0
            *** 可以用于产生可重复的结果(每次取一样的seed即可得到相同的随机划分)

““

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值