Я хочу обучить модель lgb с пользовательской метрикой: f1_score
со weighted
значением.
Я прошел через передовые примеры lightgbm над здесь и нашел implimentation пользовательской бинарной функции ошибки. Я реализовал как аналогичный functon для возврата 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.?
Документы немного запутывают. При описании сигнатуры функции, которую вы передаете feval, они называют ее параметрами preds и train_data, что немного вводит в заблуждение.
Но, похоже, работает следующее:
from sklearn.metrics import f1_score
def lgb_f1_score(y_hat, data):
y_true = data.get_label()
y_hat = np.round(y_hat) # scikits f1 doesn't like probabilities
return 'f1', f1_score(y_true, y_hat), True
evals_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.
f1_score
не рассчитывается. Ошибка:C:\ProgramData\Anaconda3\lib\site-packages\sklearn\metrics\classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 due to no predicted samples.