Xgboost在做分类问题时拟合的是啥

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Xgboost在做分类问题时拟合的是啥相关的知识,希望对你有一定的参考价值。

参考技术A

https://www.zhihu.com/question/269929168?sort=created

先说结论,拟合的是概率值。

XGBoost是GBDT的升级版,下面用GBDT来说明处理分类问题时,每一轮迭代的是什么。

XGBoost和GBDT均是基于CART回归树,对GBDT来说,当预测值为连续值时,计算预测值与真实值之间距离的平方和,均方误差(MSE)是最常用的回归损失函数,此时负梯度刚好是残差,当预测值为离散值,或者说处理分类问题时,拟合的也是‘负梯度’,只是要转一道弯。

这道弯是将预测值和真实值转换为类别的概率,迭代过程就是让预测概率不断接近真实概率。

对数损失logloss 常用于评估分类器的概率输出,对数损失通过惩罚错误的分类,实现对分类器准确度(Accuracy)的量化。 最小化对数损失基本等价于最大化分类器的准确度。为了计算对数损失,分类器必须提供对输入的所属的每个类别的概率值,不只是最可能的类别。

下面以一个简单二分类为例,选取损失函数为logloss:

[图片上传失败...(image-e5c779-1587638268216)]

其中:

[图片上传失败...(image-9362bd-1587638268216)]

代入后可得:

[图片上传失败...(image-822803-1587638268216)]

负梯度在下图可见:

</noscript>

以一个简单的数据集来说明第一步和第二步拟合的是什么。

</noscript>

Yi的取值是0,1,其中0和1亦可以表示样本取正值的真实概率,第一步所有样本未分裂,是一个树桩,让损失函数最小,初始化可得:

[图片上传失败...(image-7c1107-1587638268216)]

= [图片上传失败...(image-15b72e-1587638268216)]

=0.088

第一棵树,当m=1时,计算负梯度 [图片上传失败...(image-c6b696-1587638268216)]

= [图片上传失败...(image-ce4b70-1587638268216)]

可得:

</noscript>

接着,会以 [图片上传失败...(image-cace9f-1587638268216)]

为目标,拟合一颗树。

XGBoost 中多类分类的损失函数是啥?

【中文标题】XGBoost 中多类分类的损失函数是啥?【英文标题】:Which is the loss function for multi-class classification in XGBoost?XGBoost 中多类分类的损失函数是什么? 【发布时间】:2017-06-18 10:08:02 【问题描述】:

我想知道哪个损失函数使用 XGBoost 进行多类分类。我找到了in this question二进制情况下逻辑分类的损失函数。

我认为对于多类情况,它可能与 GBM(对于 K 类)which can be seen here 相同,如果 x 的标签为 k,则 y_k=1,在任何其他情况下为 0,并且 p_k(x ) 是 softmax 函数。但是,我使用此损失函数进行了一阶和二阶梯度,并且粗麻布与代码 here(在 SoftmaxMultiClassObj 中的函数 GetGradient 中)中定义的不匹配,常数为 2。

你能告诉我使用的是哪个损失函数吗?

提前谢谢你。

【问题讨论】:

【参考方案1】:

正如您所怀疑的,用于多类的损失函数是 softmax 目标函数。到目前为止,多类的唯一选项显示在下面的引用中,multi:softprob 返回所有概率,而不是仅返回最可能类的概率。

“multi:softmax” – 设置 XGBoost 使用 softmax 目标进行多类分类,您还需要设置 num_class(类数)

“multi:softprob”——和softmax一样,但是输出一个ndata * nclass的向量,可以进一步reshape成ndata,nclass矩阵。结果包含每个数据点属于每个类的预测概率。

见https://xgboost.readthedocs.io/en/latest//parameter.html#learning-task-parameters。

【讨论】:

【参考方案2】:

下面给出了一个很好的例子:

http://machinelearningmastery.com/avoid-overfitting-by-early-stopping-with-xgboost-in-python/

基本上,您可以使用“eval_metric”参数定义损失函数。 (回归默认为 rmse,分类默认为 error)

官方github repo中给出了“error”函数的描述:

""error":二分类错误率,计算公式为#(wrong cases)/#(all case)。对于预测,评估会将预测值大于0.5的实例视为正实例,而其他的作为否定实例。”

还可以在https://github.com/dmlc/xgboost/blob/master/doc/parameter.md 的“学习任务参数”部分找到完整的评估指标列表

希望能回答你的问题,祝你好运,

【讨论】:

您描述的是评估指标,而不是损失函数。前者用于评估性能,而后者实际用于拟合模型。

以上是关于Xgboost在做分类问题时拟合的是啥的主要内容,如果未能解决你的问题,请参考以下文章

xgboost是回归还是分类

xgboost原理,怎么防止过拟合。随机森林,GBDT,Xgoost的区别,bagging和boosting

在 XGboost 中呈现数字分类数据(特别是一天中的小时)变量的正确方法是啥?

在分类列上训练 xgboost 时遇到问题

XGBoost 分类变量:虚拟化与编码

在 XGBoost 中为分类设置应用增量学习时出错(python)