如何解决lightgbm中的f1_score指标
该文档有点混乱。在描述传递给feval的函数的签名时,他们将其参数 称为preds 和 train_data ,这有点误导。
但是以下似乎有效:
from sklearn.metrics import f1_score
def lgb_f1_score(y_hat, data):
y_true = data.get_label()
y_hat = np.round(y_hat) # scikits f1 doesn't like probabilities
return 'f1', f1_score(y_true, y_hat), True
evals_result = {}
clf = lgb.train(param, train_data, valid_sets=[val_data, train_data], valid_names=['val', 'train'], feval=lgb_f1_score, evals_result=evals_result)
lgb.plot_metric(evals_result, metric='f1')
要使用多个自定义指标,请像上面定义一个整体自定义指标函数,在其中您可以计算所有指标并返回一个元组列表。
编辑:固定代码,当然F1越大越好,应将其设置为True。
解决方法
我想培养与定制度量的LGB模式:f1_score
与weighted
平均水平。
我在这里遍历了lightgbm的高级示例,并发现了自定义二进制错误函数的实现。我实现了类似的功能来返回f1_score,如下所示。
def f1_metric(preds,train_data):
labels = train_data.get_label()
return 'f1',f1_score(labels,preds,average='weighted'),True
我试图通过传递feval
参数来训练模型,f1_metric
如下所示。
evals_results = {}
bst = lgb.train(params,dtrain,valid_sets= [dvalid],valid_names=['valid'],evals_result=evals_results,num_boost_round=num_boost_round,early_stopping_rounds=early_stopping_rounds,verbose_eval=25,feval=f1_metric)
然后我得到 ValueError: Found input variables with inconsistent numbers of
samples:
训练集将传递给函数,而不是验证集。
如何配置以便通过验证集并返回f1_score。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。