一般做机器学习的小伙伴,应该用xgb比较多点,因为它比较透明易懂,且在sklearn库里的xgb损失函数是泰勒二阶展开的,而GBDT的损失函数只是一阶,从精准性来说用xgb模型会更好,前提是你也是用python的。

都说了解一个模型原理的时候,了解它的参数是必备的。下面我们来说说xgb都有哪些参数,以及这些参数的作用等等。

一、通用版参数

1、 booster [default= gbtree ]
用于选择每次迭代的模型。一般,gbtree和dart是用于树模型的,而gblinear更适用于线性模型,gbtree的效果也远胜于gblinear。

2、nthread
用于选择分几个进程来训练模型,一般默认系统的核数(4)
当我们上面的booster选择了树模型了之后,要针对树模型进行调参。那么下面介绍下树模型的参数。

二、树模型参数

1、eta [default=0.3, 别名: learning_rate]
学习速率,取值范围:[0:1]。用于控制树的权重,xgb模型在进行完每一轮迭代之后,会将叶子节点的分数乘上该系数,以便于削弱各棵树的影响,避免过拟合。一般对eta调优时会结合迭代次数进行考虑。

2、gamma [default=0, 别名: min_split_loss]
用于限制在叶子节点上进一步分裂所需的最小损失函数下降值。分裂节点时,损失函数减小值只有大于等于gamma节点才分裂。gamma越大,算法越保守。取值范围为[0,]。

3、max_depth [default=6]
树的最大深度。一般取值范围为[3,10],随着深度的升高,模型就越复杂,则就容易发生过拟合。

4、min_child_weight[default=1]
分裂的叶子节点中样本权重和的最小值。如果新分裂的节点的样本权重和小于min_child_weight则停止分裂。增大min_child_weight可以减少过拟合。取值范围为:[0,]。

5、subsample [default=1]
用于每次分裂一颗树时随机样本(行)采样的比例。取值范围为:(0,1],但是一般取值[0.5,1],当取值为0.5时,较取值1时更能阻止过拟合的发生。

6、colsample_bytree[default=1]
用于每次分裂一颗树时随机样本(列)采样的比例。取值范围为:(0,1],一般取值为[0.5,1]。

7、lambda [default=1, 别名: reg_lambda]
权重的L2正则化项。增大lambda将使模型可以缓解模型的过拟合。因为加入了惩罚项L2之后,参数公式是w=(X^T XλI)^(-1) X^T Y。可以看出来加入L2正则项使得矩阵正定,将各个特征的贡献都均匀了。

8、alpha [default=0, 别名: reg_alpha]
权重的L1正则化项。增大该值将使模型更保守。一般我们做特征选择的时候会用L1正则项。

9、tree_method [default=auto]
这是xgb框架自带的训练方法。
可选参数为:[auto, exact, approx, hist, gpu_hist]
这里我大概讲讲每个参数值的意思:
Auto: 模型会自己判断输入的训练样本的大小去更新该参数,比如数据集较小的时候会选择“exact”模式。当数据集较大时,会更新为“approx.”模式。”exact”其实是一种较贪婪的分裂模式,它会遍历所有的节点去进行选择。当数据及非常大的时候可以选择”hist“。

10、scale_pos_weight [default=1]
用于调节样本不均衡的情况。一般取值可以为:负样本数/正样本数。
可能有小伙伴不知道正负样本是什么。 一般模型里偏少数的部分会认为是正样本 如逾期客户 医学上的发病的病人 用户响应模型中的实际响应客户。

三、学习任务参数

1、 objective
[default=reg:squarederror]
很多文章说这个参数的默认值是:reg:linear
。(我这里参照的官方文档)
根据任务场景来选择的目标。可选参数:【binary:logistic,reg:logistic,multi:softmax】
当我们是二分类任务时,一般选:binary:logistic。

2、 eval_metric [default according to objective]
用于选择需要最小化的损失函数。可选参数:【rmse,logloss,auc】
下面详细讲讲各个参数值的含义。
rmse(Root Mean Squared Error称均方根误差)=√(1/n ∑_(i=1)^n▒〖(y_i-y ̂_i)〗^2 )
logloss(negative log-likelihood负对数似然函数,也称Cross Entropy Loss Function 交叉熵损失函数)= 1/n ∑_(i=1)^n▒〖-[y_i log⁡〖(p_i )+(1-y_i)log⁡(1-p_i)〗 〗]

其中,yi表示样本i的实际label,正样本为1,负样本为0。所以实际使用的时候,正类只计算方括号的前半部分,负类计算方括号里的后半部分。(Log实际上是ln)。下面举个例子说说sklearn里如何计算交叉熵损失函数的。

from sklearn.metrics import log_loss
#样本实际标签label
y_true = [0, 0, 1, 1]
#样本预测的概率,前面数值表示负类概率,后面数值表示正类概率
y_pred = [[.9, .1], [.8, .2], [.3, .7], [.01, .99]]
l=log_loss(y_true, y_pred)
print(l) #0.1738

一般,rmse用于回归问题,logloss用于分类问题,auc用于分类或者排序问题。

关注我,不迷路。(🙂)

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐