我有一个二进制分类任务,并使用xgboost软件包来解决它。基本上,我只是使用增强树来做到这一点。但是我正在对Brier分数进行评估,因此我认为我将优化Brier损失函数(定义为在逻辑分类之上应用的brier分数),这使我可以如下定义Brier损失的梯度和粗麻布:
def brier(preds, dtrain):
labels = dtrain.get_label()
preds = 1.0 / (1.0 + np.exp(-preds))
grad = 2*(preds-labels)*preds*(1-preds)
hess = 2*(2*(labels+1)*preds-labels-3*preds*preds)*preds*(1-preds)
return grad, hess
def evalerror(preds, dtrain):
preds = 1.0 / (1.0 + np.exp(-preds))
labels = dtrain.get_label()
errors = (labels - preds)**2
return 'brier-error', float(np.sum(errors)) / len(labels)
param = {'eta':0.01,
'max_depth': 6, # the maximum depth of each tree
#'objective': 'binary:logistic',
'booster' : 'gbtree',
'eval_metric':['rmse', 'auc']}
bst = xgb.train(param,dtrain, num_boost_round=999,early_stopping_rounds=10,obj=brier, feval=evalerror,evals=[(dtrain,'train'),(dtest,'test')])
唯一的问题是,这样做会使我对测试集的预测得到负值,这表明xgboost模型的输出不是预期的逻辑概率。 有谁知道我在这里缺少什么,或者是否有更好的方法来优化石楠木得分?
任何帮助将不胜感激!!
谢谢
答案 0 :(得分:1)
我认为您可能需要查看以下内容:https://arxiv.org/pdf/1610.02757.pdf
通过引用作者的话“请注意,XGBoost不适用于确切的粗麻布,而是具有其对角线近似值。”
答案 1 :(得分:1)
我遇到了同样的问题,并进行了一些调查。我认为OP的计算是正确的,这里的问题不是关于@ Damodar8所建议的使用对角线近似而不是@ Damodar8建议的精确粗麻布。
如here所指出:
注意:执行自定义损失函数时,默认预测值为 保证金。这可能会使内置评估指标无法正常运行 例如,我们正在做物流损失,预测是物流之前的得分 转换:内置评估错误假设输入是逻辑运算后 转换在使用自定义项时,请记住这一点,也许 您需要编写自定义的评估功能
尽管评论本身很难解开,但加粗的句子解释了OP的问题。解决方案是仅对 print(result)
结果使用逻辑转换。完整示例如下:
bst.predict