При вычислении mrr результат 1, что невозможно

У меня есть датасет для ранжирования. query_id - это уникальный айдишник пользоательской сессии по запросу таргет - был ли совершён заказ rn - ranking number report_date - feature_1-11 - фичи rn находится в промежутке от 1 до 100 обучил модель lgbm

param_ranking = {
    "objective": "lambdarank",
    "label_gain": [int(i) for i in range(int(max(y_train.max(), y_validation.max())) + 1)],
    "metric": ["ndcg"],
    "eval_at": 5,
    "random_state": 1,
    "verbosity": -1,
    # 'num_threads': 16,
    "learning_rate": 0.1,
}
callbacks = [
    lgb.early_stopping(20),
    lgb.log_evaluation(period=10)  # Коллбэк для логирования
]

model_gbm = lgb.train(
    param_ranking,
    lgb_train,
    2000,
    valid_sets=[lgb_train, lgb_valid],
    callbacks=callbacks,
    feval=custom_map5,
)

пытаюсь получить результаты

def custom_map5(preds, lgb_dataset):
    labels = lgb_dataset.get_label()
    groups_size = lgb_dataset.get_group()
    begin = 0
    ranks = []
    for group_size in groups_size:
        preds_group = preds[begin : (begin + group_size)]  # noqa
        temp = (-preds_group).argsort()
        ranks_group = np.empty_like(temp)
        ranks_group[temp] = np.arange(len(preds_group))
        ranks.append(ranks_group)
        begin += group_size
    ranks = np.concatenate(ranks)
    is_top5 = ranks < 5
    map5 = labels[is_top5].sum() / labels.sum()
    return "custom_map@5", map5, True

получаю заниженные, когда пытаюсь вычислить mrr результат 1, что невозможно. Подскажите пожалуйста где ошибка Для map5 ranks это array([69, 65, 68, ..., 11, 7, 5], dtype=int64). Вот функция для mrr

    labels = lgb_dataset.get_label()
    groups_size = lgb_dataset.get_group()
    begin = 0
    reciprocal_ranks = []
    
    for group_size in groups_size:
        preds_group = preds[begin : (begin + group_size)]
        sorted_indices = np.argsort(preds_group)[::-1]
        
        # Находим индекс первого правильного предсказания
        first_correct_idx = next((idx for idx in sorted_indices if labels[begin + idx] == 1), None)
        
        # Если есть правильное предсказание, вычисляем его обратный ранг
        if first_correct_idx is not None:
            reciprocal_rank = 1 / (first_correct_idx + 1)  # Делим на (индекс + 1)
            reciprocal_ranks.append(reciprocal_rank)
        
        begin += group_size

    mrr = np.mean(reciprocal_ranks) if reciprocal_ranks else 0  # Средний обратный ранг
    return "custom_mrr", mrr, True ```

Ответы (0 шт):