我试图实现手动的f1_score函数用于评估,但在代码中并没有调用手动评分函数(没有输出),反而报错:
” call() missing 1 required positional argument: ‘y_true’ “
如果我移除feval,代码可以正常运行。
def maual_scoring(y_hat, data): print("I am here") y_true = data.get_label() y_hat = np.argmax(y_hat, axis =1 ) #多分类问题 return 'f1', f1_score(y_true, y_hat), Truemodel = lgb.train( params = lgb_params.copy(), train_set=lgb_model, valid_sets=[lgb_model, lgb_val], valid_names=['Train', 'Validation'], verbose_eval=100, feval=maual_scoring, num_boost_round=99999, early_stopping_rounds=100)
得到答案: 需要重塑预测结果
回答:
def maual_scoring(preds, dtrain): labels = dtrain.get_label() preds = preds.reshape(-1, 4) # 我应该重塑预测结果 preds = preds.argmax(axis = 1) f_score = f1_score(preds, labels, average = 'macro') return 'f1_score', f_score, True
feval (callable or None, optional (default=None)) – 自定义评估函数。应接受两个参数:preds, train_data。对于多类任务,preds首先按类ID分组,然后按行ID分组。如果你想获取第j类中的第i行的预测,访问方式是preds[j * num_data + i]。注意:应返回 (eval_name, eval_result, is_higher_better) 或此类元组的列表。要忽略与使用的目标对应的默认指标,请在params中将metric参数设置为字符串”None”。
由于这是多分类问题,因此我们需要重塑预测结果以获得与model.predict_proba()
类似的输出形状