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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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