xgboost 自定义目标函数和评估函数

https://zhpmatrix.github.io/2017/06/29/custom-xgboost/

https://www.cnblogs.com/silence-gtx/p/5812012.html

https://blog.csdn.net/hfzd24/article/details/76903927

 

如下,自定义评估函数 maxrecall:

def maxRecall(preds,dtrain): #preds是结果(概率值),dtrain是个带label的DMatrix
    labels=dtrain.get_label() #提取label
    preds=1-preds
    precision,recall,threshold=precision_recall_curve(labels,preds,pos_label=0)
    pr=pd.DataFrame({'precision':precision,'recall':recall})
    return 'Max Recall:',pr[pr.precision>=0.97].recall.max()

参数和轮数就按一般设置,然后watchlist不能少,不然就不会输出东西了,比如watchlist=[(xgb_train,'train'), (xgb_test,'eval')]

最后就是xgb.train中的内容了,写成:

bst=xgb.train(param,xg_train,n_round,watchlist,feval=maxRecall,maximize=False)

就行了。feval就是你的metric,maximize要加上,虽然不知道具体有什么用……

 

2、如果你需要自定义损失函数的话。先写你的损失函数,比如:

def custom_loss(y_pre,D_label): #别人的自定义损失函数
    label=D_label.get_label()
    penalty=2.0
    grad=-label/y_pre+penalty*(1-label)/(1-y_pre) #梯度
    hess=label/(y_pre**2)+penalty*(1-label)/(1-y_pre)**2 #2阶导
    return grad,hess

bst=xgb.train(param,xg_train,n_round,watchlist,feval=maxRecall,obj=custom_loss,maximize=False)

只要再加上obj=custom_loss就可以了...

转载于:https://www.cnblogs.com/Allen-rg/p/9542365.html

TW-FL(Two-Way Focal Loss)是一种针对不平衡分类任务设计的损失函数,它结合了Focal Loss和Weighted Focal Loss的优点。如果你想将其嵌入到XGBoost( Extreme Gradient Boosting,一种流行的梯度提升算法)中,通常XGBoost作为决策树的集成方法并不直接支持自定义损失函数,因为它的核心是一个优化过程,而非神经网络训练框架。 然而,你可以通过以下步骤间接实现这种损失: 1. **转换为监督学习**:虽然XGBoost原生不支持非线性模型,但它可以接受任何形式的监督数据。你需要将目标变量处理成二分类的形式,即使对于多标签问题也是如此。 2. **包装自定义评分函数**:XGBoost允许用户提供自定义目标函数(score function),这会影响预测值如何影响最终的模型训练。你可以编写一个Python函数,计算基于TW-FL的得分。 ```python import xgboost as xgb def twf_loss(preds, dtrain): labels = dtrain.get_label() # 根据TW-FL公式计算损失 # 这里假设preds是模型输出的概率分布,labels是实际标签 loss = ... # 实现TW-FL的具体计算 return 'error', loss # 创建DMatrix并训练模型 dtrain = xgb.DMatrix(..., label=...) bst = xgb.train({ 'objective': None, # 使用自定义评分函数 'eval_metric': 'mlogloss', # 或者其他的评估指标 'custom_obj': twf_loss }, dtrain) ``` 3. **评估和调整**:训练完成后,你需要利用验证集或交叉验证来评估模型性能,并根据需要调整超参数。 注意,这种方法可能不如直接使用支持深度学习库如LightGBM或CatBoost等方便,因为它们可以直接支持自定义损失。如果条件允许,考虑改用这些库可能会更简单。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值