Sklearn.xgboost

  • sklearn.xgboost并不是sklearn中有xgboost类库,而是xgboost具有sklearn风格的API接口。
  • XGBoost类库除了支持决策树作为弱学习器外,还支持线性分类器,以及带DropOut的DART决策树,不过通常情况下,使用默认的决策树弱学习器即可。
  • 对于sklearn风格的接口,主要有2个类可以使用,一个是分类用的XGBClassifier,另一个是回归用的XGBRegressor。

XGBoost框架参数

  1. booster:决定了XGBoost使用的弱学习器类型。默认gbtree, 也就是CART决策树,还可以是线性弱学习器gblinear以及DART。
  2. n_estimators:num_boosting_rounds,关系到XGBoost模型的复杂度,代表了决策树弱学习器的个数。这个参数对应sklearn GBDT的n_estimators。
  3. objective:代表了要解决的问题对应的损失函数。
    • reg:linear – 线性回归 (reg:squarederror ,即MSE均方误差)
    • reg:logistic – 逻辑回归
    • binary:logistic – 二分类逻辑回归,输出为概率
    • binary:logitraw – 二分类逻辑回归,输出的结果为wTx
    • count:poisson – 计数问题的poisson回归,输出结果为poisson分布。
    • multi:softmax – 使用softmax目标函数做多分类,需要设置参数num_class(类别个数)
    • multi:softprob – 如同softmax,但是输出结果为ndata*nclass的向量,其中的值是每个数据分为每个类的概率。
  4. learning_rate:控制每个弱学习器的权重缩减系数,和sklearn GBDT的learning_rate类似,较小的learning_rate意味着需要更多的弱学习器的迭代次数。
  5. n_jobs控制算法的使用线程数,一般设置成-1,使用所有线程。
  6. scale_pos_weight用于类别不平衡的时候,设置为负例和正例的比例。类似于sklearn中的class_weight。
  7. importance_type则可以查询各个特征的重要性程度。可以选择“gain”, “weight”, “cover”, “total_gain” 或者 “total_cover”,最后通过调用booster的get_score方法获取对应的特征权重。
    • “weight”通过特征被选中作为分裂特征的计数来计算重要性
    • “gain”和“total_gain”则通过分别计算特征被选中做分裂特征时带来的平均增益和总增益来计算重要性。
    • “cover”和 “total_cover”通过计算特征被选中做分裂时的平均样本覆盖度和总体样本覆盖度来来计算重要性。
  8. verbosity调节系统输出内容。
  9. eval_metric 模型评测标准
    • rmse: 均方根误差
    • mae: 平均绝对值误差
    • logloss: negative log-likelihood
    • error: 二分类错误率。其值通过错误分类数目与全部分类数目比值得到。error@t: 不同的划分阈值可以通过 ‘t’进行设置
    • merror: 多分类错误率,计算公式为(wrong cases)/(all cases)
    • mlogloss: 多分类log损失
    • auc: 曲线下的面积
    • ndcg: Normalized Discounted Cumulative Gain
    • map: 平均正确率
  10. verbose调节系统是否输出。

XGBoost 弱学习器参数

这里只讨论使用gbtree默认弱学习器的参数。

  1. max_depth: 控制树结构的深度,数据少或者特征少的时候可以不管这个值。如果模型样本量多,特征也多的情况下,需要限制这个最大深度,具体的取值一般要网格搜索调参。这个参数对应sklearn GBDT的max_depth。

  2. min_child_weight: 最小的子节点权重阈值,如果某个树节点的权重小于这个阈值,则不会再分裂子树,即这个树节点就是叶子节点。这里树节点的权重使用的是该节点所有样本的二阶导数的和,即XGBoost中 H t j H_{tj} Htj: H t j = ∑ x i ∈ R t j h t i H_{tj} = \sum\limits_{x_i \in R_{tj}}h_{ti} Htj=xiRtjhti这个值需要网格搜索寻找最优值,在sklearn GBDT没有完全对应的参数,不过min_samples_split从另一个角度起到了阈值限制。

  3. gamma: XGBoost的决策树分裂所带来的损失减小阈值。在尝试树结构分裂时,会尝试最大数下式: max ⁡ 1 2 G L 2 H L + λ + 1 2 G R 2 H R + λ − 1 2 ( G L + G R ) 2 H L + H R + λ − γ \max \frac{1}{2}\frac{G_L^2}{H_L + \lambda} + \frac{1}{2}\frac{G_R^2}{H_R+\lambda} - \frac{1}{2}\frac{(G_L+G_R)^2}{H_L+H_R+ \lambda} - \gamma max21HL+λGL2+21HR+λGR221HL+HR+λ(GL+GR)2γ这个最大化后的值需要大于gamma,才能继续分裂子树。这个值也需要网格搜索寻找最优值。

  4. subsample: 子采样参数,不放回抽样,和sklearn GBDT的subsample作用一样。选择小于1的比例可以减少方差,即防止过拟合,但是会增加样本拟合的偏差,因此取值不能太低。初期可以取值1,如果发现过拟合后可以网格搜索调参找一个相对小一些的值。

  5. colsample_bytree/colsample_bylevel/colsample_bynode: 这三个参数都用于特征采样,默认都是不做采样,即使用所有的特征建立决策树。colsample_bytree控制整棵树的特征采样比例,colsample_bylevel控制某一层的特征采样比例,而colsample_bynode控制某一个树节点的特征采样比例。

    比如一共64个特征,则假设colsample_bytree,colsample_bylevel和colsample_bynode都是0.5,则某一个树节点分裂时会随机采样8个特征来尝试分裂子树。

  6. reg_alpha/reg_lambda: 这2个是XGBoost的正则化参数。reg_alpha是L1正则化系数,reg_lambda是L2正则化系数,XGBoost的正则化损失项部分: Ω ( h t ) = γ J + λ 2 ∑ j = 1 J w t j 2 \Omega(h_t) = \gamma J + \frac{\lambda}{2}\sum\limits_{j=1}^Jw_{tj}^2 Ω(ht)=γJ+2λj=1Jwtj2

上面这些参数都是需要调参的,不过一般先调max_depth,min_child_weight和gamma。如果发现有过拟合的情况下,再尝试调后面几个参数。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值