我想使用自定义指标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的函数的签名时,它们将其参数称为preds和train_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。