使用具有平均精确召回得分的lightgbm

时间:2018-07-31 17:51:08

标签: lightgbm

我正在使用LightGBM,并且希望使用平均精度召回率作为指标。 我尝试定义feval:

cv_result = lgb.cv(params=params, train_set=lgb_train, feature_name=Rel_Feat_Names, feval=APS)

其中APS定义为:

def APS(preds, train_data):
    y_pred_val = []
    y_test_val = []
    for i, stat in enumerate(train_data.get_label.isnull()):
        if ~stat:
            y_pred_val.append(preds[i])
            y_test_val.append(train_data.get_label[i])
    aps = average_precision_score(np.array(y_test_val), np.array(y_pred_val))
    return aps

我得到一个错误:

TypeError:参数的未知类型:feval,得到了:function

我也尝试使用“ MAP”作为指标

cv_result = lgb.cv(params=params, train_set=lgb_train, feature_name=Rel_Feat_Names, "metric="MAP")

但出现以下错误:

“ lightgbm.basic.LightGBMError:对于MAP指标,应该有查询信息”

我找不到所需的查询信息。

如何正确使用feval并定义“ MAP”所需的查询

谢谢

1 个答案:

答案 0 :(得分:0)

现在您可以将 map(别名 mean_average_precision)作为指标,如 here 所述,但要正确回答应用 feval 的问题:

自定义指标的输出应该是名称、值和greater_is_better 的元组,因此在您的情况下:

def APS(preds, train_data):
    aps = average_precision_score(train_data.get_label(), preds)
    return 'aps', aps, False

然后在您的 params 中包含以下内容:'objective': 'binary', 'metric': 'None'