f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型,并使用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?


回答:

文档有些 confusing。当描述传递给feval的函数的签名时,它们将其参数称为predstrain_data,这有点误导。

但以下方法似乎有效:

from sklearn.metrics import f1_scoredef lgb_f1_score(y_hat, data):    y_true = data.get_label()    y_hat = np.round(y_hat) # scikits f1不喜欢概率值    return 'f1', f1_score(y_true, y_hat), Trueevals_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。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

如何预测不平衡数据的类别?

在机器学习的二元分类问题中,当类别不平衡时,哪个类别被…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注