【问题标题】:Is it possible to supply a custom objective function of categorical data to xgboost in python?是否可以在 python 中向 xgboost 提供分类数据的自定义目标函数?
【发布时间】:2016-06-11 23:34:00
【问题描述】:
我有分类数据和一个正在尝试优化的目标函数。在 xgboost 文档中,提到您可以提供自己的目标函数,但它必须返回梯度和粗麻布。当我有分类数据时,我不确定粗麻布或梯度是什么意思。目标函数看起来有点像这样
sum_{all classes i} ((number of correct predictions in class_i) / (number in class i))
在这种情况下是否可以创建自定义目标函数?
【问题讨论】:
标签:
python
machine-learning
xgboost
【解决方案1】:
要分析计算目标函数的梯度和 hessian(二阶导数),您需要根据模型的预测和给定的真实标签来定义它。
从您的目标函数可以清楚地看出,您正在优化加权准确度(无百分比)指标,其中类的权重取决于该类的实例数。
让我们为三个类定义以下内容,A、B 和 C:
-
C_A、C_B 和 C_C 是相应类别中正确预测的数量;
- N_A, N_B, N_C 是每个类中的实例数;
- N_A+N_B+N_C = T 是实例总数。
然后,您的目标函数转换为:C_A/N_A + C_B/N_B + C_C/N_C。
也可以写成:(C_A/T)*(T/N_A) + (C_B/T)*(T/N_B) + (C_C/T)*(T/N_C)。
这可以直接与整体准确度进行比较:C_A/T + C_B/T + C_C/T
这意味着您可以通过在 xgboost 中使用“multi:softmax”内置目标函数来间接优化您的目标。