xgboost 调参经验

1.xgboost 基本方法和默认参数

在训练过程中主要用到两个方法:xgboost.train()和xgboost.cv().

#xgboost.train()API
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,learning_rates=None,xgb_model=None)

  • params 这是一个字典,里面包含着训练中的参数关键字和对应的值,形式是params = {‘booster’:’gbtree’,’eta’:0.1}
  • dtrain 训练的数据
  • num_boost_round 这是指提升迭代的个数
  • evals 这是一个列表,用于对训练过程中进行评估列表中的元素。形式是evals = [(dtrain,’train’),(dval,’val’)]或者是evals = [(dtrain,’train’)],对于第一种情况,它使得我们可以在训练过程中观察验证集的效果。
  • obj,自定义目的函数
  • feval,自定义评估函数
  • maximize ,是否对评估函数进行最大化
  • early_stopping_rounds,早期停止次数 ,假设为100,验证集的误差迭代到一定程度在100次内不能再继续降低,就停止迭代。这要求evals 里至少有 一个元素,如果有多个,按最后一个去执行。返回的是最后的迭代次数(不是最好的)。如果early_stopping_rounds 存在,则模型会生成三个属性,bst.best_score,bst.best_iteration,和bst.best_ntree_limit
  • evals_result 字典,存储在watchlist 中的元素的评估结果。
  • verbose_eval (可以输入布尔型或数值型),也要求evals 里至少有 一个元素。如果为True ,则对evals中元素的评估结果会输出在结果中;如果输入数字,假设为5,则每隔5个迭代输出一次。
  • learning_rates 每一次提升的学习率的列表,
  • xgb_model ,在训练之前用于加载的xgb model。

2.实战经验中调参方法

首先 parameters 设置如下:

params = {
            'booster':'gbtree',
            'objective':'binary:logistic',
            'eta':0.1,
            'max_depth':10,
            'subsample':1.0,
            'min_child_weight':5,
            'colsample_bytree':0.2,
            'scale_pos_weight':0.1,
            'eval_metric':'auc',
            'gamma':0.2,            
            'lambda':300
}
  • colsample_bytree 要依据特征个数来判断
  • objective 目标函数的选择要根据问题确定,
  •                     如果是回归问题 ,一般是 reg:linear , reg:logistic , count:poisson 
  •                     如果是分类问题,一般是binary:logistic ,rank:pairwise
  • 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。


  • 1、objective[默认reg:linear]

    这个参数定义需要被最小化的损失函数。最常用的值有:binary:logistic 二分类的逻辑回归,返回预测的概率(不是类别)。 multi:softmax 使用softmax的多分类器,返回预测的类别(不是概率)。在这种情况下,你还需要多设一个参数:num_class(类别数目)。 multi:softprob 和multi:softmax参数一样,但是返回的是每个数据属于各个类别的概率。

参数初步定之后划分20%为验证集,准备一个watchlist 给train和validation set ,设置num_round 足够大(比如100000),以至于你能发现每一个round 的验证集预测结果,如果在某一个round后 validation set 的预测误差上升了,你就可以停止掉正在运行的程序了。

watchlist = [(dtrain,'train'),(dval,'val')]
model = xgb.train(params,dtrain,num_boost_round=100000,evals = watchlist)

然后开始逐个调参了。

  • 首先调整max_depth ,通常max_depth 这个参数与其他参数关系不大,初始值设置为10,找到一个最好的误差值,然后就可以调整参数与这个误差值进行对比。比如调整到8,如果此时最好的误差变高了,那么下次就调整到12;如果调整到12,误差值比10 的低,那么下次可以尝试调整到15.
  • 在找到了最优的max_depth之后,可以开始调整subsample,初始值设置为1,然后调整到0.8 如果误差值变高,下次就调整到0.9,如果还是变高,就保持为1.0
  • 接着开始调整min_child_weight , 方法与上面同理
  • 再接着调整colsample_bytree
  • 经过上面的调整,已经得到了一组参数,这时调整eta 到0.05,然后让程序运行来得到一个最佳的num_round,(在 误差值开始上升趋势的时候为最佳 )

首先说下决策树

  • 决策树是啥? 
    举个例子,有一堆人,我让你分出男女,你依靠头发长短将人群分为两拨,长发的为“女”,短发为“男”,你是不是依靠一个指标“头发长短”将人群进行了划分,你就形成了一个简单的决策树,官方细节版本自行baidu或google

  • 划分的依据是啥? 
    这个时候,你肯定问,为什么用“头发长短”划分啊,我可不可以用“穿的鞋子是否是高跟鞋”,“有没有喉结”等等这些来划分啊,Of course!那么肯定就需要判断了,那就是哪一种分类效果好,我就选哪一种啊。

  • 分类效果如何评价量化呢? 
    怎么判断“头发长短”或者“是否有喉结”…是最好的划分方式,效果怎么量化。直观来说,如果根据某个标准分裂人群后,纯度越高效果越好,比如说你分为两群,“女”那一群都是女的,“男”那一群全是男的,这个效果是最好的,但事实不可能那么巧合,所以越接近这种情况,我们认为效果越好。于是量化的方式有很多,信息增益(ID3)、信息增益率(C4.5)、基尼系数(CART)等等,来用来量化纯度

  • 其他细节如剪枝、过拟合、优缺点、并行情况等自己去查吧。决策树的灵魂就已经有了,依靠某种指标进行树的分裂达到分类/回归的目的(上面的例子是分类),总是希望纯度越高越好。

说下Xgboost的建树过程

Xgboost是很多CART回归树集成

  • 概念1:回归树与决策树 
    事实上,分类与回归是一个型号的东西,只不过分类的结果是离散值,回归是连续的,本质是一样的,都是特征(feature)到结果/标签(label)之间的映射。说说决策树和回归树,在上面决策树的讲解中相信决策树分类已经很好理解了。

    回归树是个啥呢?

    直接摘抄人家的一句话,分类树的样本输出(即响应值)是类的形式,如判断蘑菇是有毒还是无毒,周末去看电影还是不去。而回归树的样本输出是数值的形式,比如给某人发放房屋贷款的数额就是具体的数值,可以是0到120万元之间的任意值。

    那么,这时候你就没法用上述的信息增益、信息增益率、基尼系数来判定树的节点分裂了,你就会采用新的方式,预测误差,常用的有均方误差、对数误差等。而且节点不再是类别,是数值(预测值),那么怎么确定呢,有的是节点内样本均值,有的是最优化算出来的比如Xgboost。 
    细节http://blog.csdn.net/app_12062011/article/details/52136117博主讲的不错

  • 概念2:boosting集成学习,由多个相关联的决策树联合决策,什么叫相关联,举个例子,有一个样本[数据->标签]是[(2,4,5)-> 4],第一棵决策树用这个样本训练得预测为3.3,那么第二棵决策树训练时的输入,这个样本就变成了[(2,4,5)-> 0.7],也就是说,下一棵决策树输入样本会与前面决策树的训练和预测相关

    与之对比的是random foreast(随机森林)算法,各个决策树是独立的、每个决策树在样本堆里随机选一批样本,随机选一批特征进行独立训练,各个决策树之间没有啥毛线关系。

    所以首先Xgboost首先是一个boosting的集成学习




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值