lightgbm中的f1_score指标

发布于 2021-01-29 16:03:35

我想培养与定制度量的LGB模式:f1_scoreweighted平均水平。

我在这里遍历了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。

关注者
0
被浏览
218
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    该文档有点混乱。在描述传递给feval的函数的签名时,他们将其参数 称为predstrain_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。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看