如何在Brier分数上优化升压树以进行分类?

时间:2018-10-01 17:10:16

标签: python machine-learning xgboost

我有一个二进制分类任务,并使用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模型的输出不是预期的逻辑概率。 有谁知道我在这里缺少什么,或者是否有更好的方法来优化石楠木得分?

任何帮助将不胜感激!!

谢谢

2 个答案:

答案 0 :(得分:1)

我认为您可能需要查看以下内容:https://arxiv.org/pdf/1610.02757.pdf

通过引用作者的话“请注意,XGBoost不适用于确切的粗麻布,而是具有其对角线近似值。”

答案 1 :(得分:1)

我遇到了同样的问题,并进行了一些调查。我认为OP的计算是正确的,这里的问题不是关于@ Damodar8所建议的使用对角线近似而不是@ Damodar8建议的精确粗麻布。

here所指出:

注意:执行自定义损失函数时,默认预测值为 保证金。这可能会使内置评估指标无法正常运行 例如,我们正在做物流损失,预测是物流之前的得分 转换:内置评估错误假设输入是逻辑运算后 转换在使用自定义项时,请记住这一点,也许 您需要编写自定义的评估功能

尽管评论本身很难解开,但加粗的句子解释了OP的问题。解决方案是仅对 print(result) 结果使用逻辑转换。完整示例如下:

bst.predict