Какова концепция информации о запросах lightgbm (для метрики карты)? - PullRequest
0 голосов
/ 01 ноября 2018

Я пытаюсь активировать lightgbm с помощью метрики map (я объясню, почему я делаю это в конце этого поста), со следующими параметрами dict (используя sklearn API):

param = {

    'objective': 'binary',
    'num_threads': 40,
    'metric': 'map',
    'eval_at': 300,
    'feature_fraction': 1.0,
    'bagging_fraction': 1.0,
    'min_data_in_leaf': 50,
    'max_depth': -1,
    'subsample_for_bin': 200000,
    'subsample': 1.0,
    'subsample_freq': 0,
    'min_split_gain': 0.0,
    'min_child_weight': 0.001,
    'min_child_samples': 20,
    'n_estimators': 9999
}

но я получаю следующую ошибку:

> [LightGBM] [Fatal] For MAP metric, there should be query information
> Traceback (most recent call last):   File
> "/home/danri/anaconda3/lib/python3.6/site-packages/IPython/core/interactiveshell.py",
> line 2910, in run_code
>     exec(code_obj, self.user_global_ns, self.user_ns)   File "<ipython-input-76-81403c753a65>", line 44, in <module>
>     eval_metric=param_1['metric'])   File "/home/danri/anaconda3/lib/python3.6/site-packages/lightgbm/sklearn.py",
> line 539, in fit
>     callbacks=callbacks)   File "/home/danri/anaconda3/lib/python3.6/site-packages/lightgbm/sklearn.py",
> line 391, in fit
>     callbacks=callbacks)   File "/home/danri/anaconda3/lib/python3.6/site-packages/lightgbm/engine.py",
> line 168, in train
>     booster = Booster(params=params, train_set=train_set)   File "/home/danri/anaconda3/lib/python3.6/site-packages/lightgbm/basic.py",
> line 1215, in __init__
>     ctypes.byref(self.handle)))   File "/home/danri/anaconda3/lib/python3.6/site-packages/lightgbm/basic.py",
> line 47, in _safe_call
>     raise LightGBMError(_LIB.LGBM_GetLastError()) lightgbm.basic.LightGBMError: b'For MAP metric, there should be query
> information'

Единственное объяснение, которое я нашел для концепции информации о запросе, было в lightgbm parameters docs

и это объяснение:

Данные запроса

Для обучения LambdaRank необходима информация запроса для данных обучения. LightGBM использует дополнительный файл для хранения данных запроса. Следующее является Пример:

27 18 67 ...

Это означает, что первые 27 строк выборки принадлежат одному запросу, а следующие 18 строк принадлежат другому и т. д. (Примечание: данные должны упорядочиваться по запросу) Если имя файла данных «train.txt», файл запроса должен быть назван как «Train.txt.query» и в той же папке с тренировочными данными. LightGBM будет загрузить файл запроса автоматически, если он существует.

Теперь вы можете указать конкретный идентификатор запроса / группы в файле данных. Пожалуйста, обратитесь к Группа параметров выше.

Я также изучил код lightgbm, чтобы найти его применение, но все еще не понимал концепцию информации запроса. Может ли кто-нибудь объяснить это?

Причина, по которой я пытаюсь использовать метрику «карта», заключается в том, что целью моей модели классификации является достижение максимального значения PPV при 10% -ом риске. Когда я оптимизирую с помощью 'auc', любое улучшение в рейтинге (в децилях с высоким риском или в других частях набора данных образцов) улучшает AUC. Я хочу, чтобы модель оптимизировалась только при улучшении 10% PPV, так как это будет ее использование в реальном мире (т.е. отправка людей с 10% риска на определенное лечение).

Хотел бы получить любую помощь.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Задумывались ли вы об использовании другого показателя? Из того, что я понимаю в вашей проблеме, lift в первом дециле может быть хорошим показателем оценки. Он сравнивает способность вашей модели находить «рискованных людей» со случайным предположением среди n% самых высоких вероятностей.

Короче говоря, вы берете верхний децил отсчетов, ранжированных по вероятности (как и предсказывает ваша модель, это «самые рискованные люди»), подсчитываете число действительных «1» в них и делите его на число фактической "1", заданной случайными предсказаниями.

Вот как вы можете реализовать это в lightgbm. Вам нужно будет указать его как "f_eval" param. Он не будет использоваться для Оптимизация , только для Оценка (и ранняя остановка). Этот код не обрабатывает случай равных предсказаний.

def f_eval_lift(pred, train_data, centile=10):
    df = pd.DataFrame({'true': train_data.get_label(), 'pred': pred})
    centile_num = int(np.ceil(centile / 100 * df.shape[0]))

    num_1 = int(df['true'].sum())
    df = df.nlargest(centile_num, columns='pred', keep='last')
    # TODO : handle the case of equal predictions

    lift_value = df['true'].sum() / (centile / 100 * num_1)
    return 'lift_' + str(centile), lift_value, True
0 голосов
/ 02 ноября 2018

Есть несколько вещей:

  • метрика используется только для оценки, а не для оптимизации (кроме выбора наилучших гиперпараметров или ранней остановки после выбора подгонки)
  • «запрос» (или «группа») - это, в основном, способ сообщить модели, как сгруппированы выборки. Для оценки (если вы используете только метрику карты и не используете функцию потерь ранжирования), можно предоставить группы с помощью аргумента eval_group метода fit, см. здесь . Это список массивов. Длина списка равна eval_set, а отдельные массивы содержат номера элементов в каждой группе. Таким образом, сумма целых чисел в массиве должна вычислять количество выборок в соответствующем наборе оценки. Обратите внимание, что для того, чтобы подсветка этой группы работала, код предполагает, что группы идут в определенной последовательности. Например, eval_group=[(2,3)] будет означать, что оценка метрики будет иметь оценочную выборку длиной 5 (= 2 + 3), а первые два элемента должны принадлежать одной группе, а следующие 3 - другой группе.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...