по mrr 0.95 val, но в предикте шляпа, как модель не учил... Данные предстовляют собой вектора. Оценки бинарыне 0 или 1. На каждый класс по +- 100 примеров.
Те исходные данные имеют вид таблицы
| вектор запроса | вектор из БД | оценка (y) | класс (index) |
Обучаю так:
train.sort_values(by='index',inplace=True)
test.sort_values(by='index',inplace=True)
X_train = train.drop(['index', 'y'], axis=1).values
y_train = train['y'].values
queries_train = train['index'].values
X_test = test.drop(['index', 'y'], axis=1).values
y_test = test['y'].values
queries_test = test['index'].values
train = Pool(
data=X_train,
label=y_train,
group_id = queries_train,
has_header=False
)
test = Pool(
data=X_test,
label=y_test,
group_id = queries_test,
has_header=False
)
default_parameters = {
'iterations': 10000,
'custom_metric': ['MRR:top=10'],
'verbose': False,
'random_seed': 0,
}
parameters = {}
def fit_model(loss_function, additional_params=None, train_pool=train, test_pool=test):
parameters = deepcopy(default_parameters)
parameters['loss_function'] = loss_function
parameters['train_dir'] = loss_function
if additional_params is not None:
parameters.update(additional_params)
model = CatBoostRanker(**parameters)
model.fit(train_pool, eval_set=test_pool, plot=True)
return model
model = fit_model('QueryRMSE', {'custom_metric': ['MRR:top=10', 'MRR:top=5'], 'task_type': 'GPU'})
затем делаю предикт. беру все вектора из базы и попрано их соединяю. Отправляю в модель. возвращаю столбец с классами делаю сортировку, получаю mrr около 0.014.
Что значит “попрано их соединяю. Отправляю в модель. возвращаю столбец с классами делаю сортировку, получаю mrr около 0.014.”. Если задача ранжирования то причем здесь классы? И что за попарное соединение?
[насколько я понял из питона, тут "класс" имеет смысл group id]
У меня маленький поисковик, на вход приходит вектор и есть df (бд) с различными вариантами (векторами). Существует несколько верных пар, но только в рамках одного group_id. Нужно это все отранжировать. В качестве обучающих данных у меня есть бинарные оценки, соответстует ли пара друг другу или нет. В качестве X я и подаю вектор запроса 512 и вектор из бд тоже 512, а X будет 1024. Класс это group_id, те множество векторов, которы либо принадлежит вектор запроса, или не принадлежит, цель как раз и определить group_id запроса, поскольку я не знаю, как связаны вектор запроса и его правильный вектор из БД, там нелинейная зависимость.
вот тут ты пишешь, что после предикта сортируешь если это так, то проблема в этом
так он же выдает оценки, я должен сделать сортировку, чтобы можно было понять, какаой класс самый вероятный
если я правильно понял, получается у вас есть x - эмбеддинг запроса d - пары эмбеддинг и group_id y - правильный group_id для текущего x получается сэмл данных вида x - (d, group_id_d1) - group_id_y - 1 x - (d, group_id_d2) - group_id_y - 0 x - (d, group_id_d3) - group_id_y - 0 x - (d, group_id_d4) - group_id_y - 0 x - (d, group_id_d5) - group_id_y - 0 x - (d, group_id_d6) - group_id_y - 1 x - (d, group_id_d7) - group_id_y - 0 и хочется выучить такую функцию чтобы на инференсе уметь f(x, d) -> [0, 1] вопрос: при чем тут ранжирование? выглядит как обычная классификация
проверь, пожалуйста, что после сортировки сэмплы и "оценки" (y) по прежнему соответствуют друг другу
разрешите вопрос. если в такой постановке мы делаем точечное ранжирование (т.е. без учёта групп), то это бинарная классификация по всем объектам. но если мы делаем списочное ранжирование то это бинарная классификация по объектам внутри группы в этом случае. я не правильно понимаю?
нет, чуть-чуть не так x - это 2 соединных вектора (запрос|вектор из бд) y - бинарная оценка (1 - позитивная пара, 0 - негативная пара) group_id - класс, которому принадлежит вектор из БД Да с виду это чистая классификация, только беда в том, что мне надо видеть с какой вероятностью именно этот класс будет выбран. А это уже ранжирование
Обсуждают сегодня