lightgbm Ручная функция подсчета очков: F1_SCORE - PullRequest
0 голосов
/ 20 сентября 2018

Здесь я пытался внедрить ручную функцию f1_score для оценки, но в коде это не вызывает функцию manual_scoring {No print o / p} вместо того, чтобы с ошибкой:

" call () отсутствует 1 обязательный позиционный аргумент: '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 ) #multi classification problem
    return 'f1', f1_score(y_true, y_hat), True

model = 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
)

Получил ответ: необходимо изменить форму пред

1 Ответ

0 голосов
/ 20 сентября 2018
def maual_scoring(preds, dtrain):
    labels = dtrain.get_label()
    preds = preds.reshape(-1, 4)  # I should have reshaped pred
    preds = preds.argmax(axis = 1)
    f_score = f1_score(preds, labels, average = 'macro')
    return 'f1_score', f_score, True

feval (вызываемый или нет, необязательный (по умолчанию = нет)) - настраиваемая функция оценки.Должен принимать два параметра: preds, train_data.Для мультиклассовой задачи preds сначала группируется по class_id, а затем по row_id.Если вы хотите получить preds i-й ​​строки в j-м классе, используйте метод доступа preds [j * num_data + i].Примечание: должен вернуть (eval_name, eval_result, is_higher_better) или список таких кортежей.Чтобы игнорировать метрику по умолчанию, соответствующую используемой цели, задайте для параметра метрики строку «None» в параметрах.

, поскольку это проблема мультиклассификации, поэтому для получения значения o / p нам необходимо изменить прогнозирование формы.в форме, аналогичной model.predict_proba()

...