xgb lgb 自定义评价函数差别

关于xgb lgb自定义评价函数,其实是区别的,
但步骤都是一样的

XGB:

#自定义评价函数---适用于XGBClassifier
#preds是预测结果概率-但是需要转换成label
#dtrain是xgb的矩阵,使用get_label() 可获取到真实的label
def get_f1 (preds,dtrain):
    label=dtrain.get_label()
    preds= np.argmax(preds.reshape(12, -1), axis=0)
    f1=f1_score(label,preds,average='weighted')
    return '1-f1_score',1-float(f1)
#调用--注意默认是最小化评价函数,如果你需要最大化,选择1-metric 就可以了
#因为我没在文档中找到最大化的参数
model=XGBClassifier()
model.fit(train_x,train_y,eval_set=[(train_x,train_y)],early_stopping_rounds=10)
#------------------------------
#适用于xgb原生接口
#区别就在于这里的preds是预测的结果标签
#自定义评价函数
def get_f1 (preds,dtrain):
    label=dtrain.get_label()
    f1=f1_score(label,preds,average='weighted')
    return 'f1-score',float(f1)
#这里调用--maxmize 参数实现最大化评价参数
model=xgb.train(params,dtrain,num_boost_round=50,evals=watchlist,feval=get_f1,
maximize=True,early_stopping_rounds=10)

#-----------------------------------------------------


LGB:

lgb使用两个接口的定义都一样,我们使用原生的接口输出的predict()也是概率值,所以这就对应了。

#自定义评价函数
#注意需要返回三个参数,最后一个参数的含义是是不是metric越大越好,这里也就是f1越大越好呀。
def get_f1 (preds,dtrain):
    label=dtrain.get_label()
    preds=np.argmax(preds.reshape(len(label),-1), axis=1)
    f1=f1_score(label,preds,average='weighted')
    return 'f1-score',float(f1),Ture
#调用与xgb没区别
bst = lgb.train(params,lgb_train,num_boost_round=50,valid_sets=lgb_val,
feval=get_f1,early_stopping_rounds=10)

ps:

xgb和lgb都有对应的两个库实现
其中xgb原生库输出预测结果是label标签,sklearn的库输出的是概率标签都可以。
lgb原生库输出的是概率,sklearn的库概率标签都可以直接输出。


end
  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值