Как предсказать вероятности в xgboost?

16

Приведенная ниже функция прогнозирования также дает значения -ve, поэтому она не может быть вероятностью.

param <- list(max.depth = 5, eta = 0.01,  objective="binary:logistic",subsample=0.9)
bst <- xgboost(param, data = x_mat, label = y_mat,nround = 3000)

pred_s <- predict(bst, x_mat_s2)

Я попробовал Google, pred_s <- predict(bst, x_mat_s2,type="response") но это не сработало.

Вопрос

Как предсказать вероятности вместо этого?

GeorgeOfTheRF
источник
Разве он не выводит вероятности по умолчанию с настройками, которые вы использовали? Я имею в виду: вы изучали pred_s и уверены, что это не вероятность?
КПБ
Нет, это имеет отрицательные значения. Вероятность должна варьироваться от 0 до 1.
GeorgeOfTheRF
Я не вижу никаких очевидных проблем. (Хотя я более знаком с оболочкой Python). Вы пытались добавить outputmargin=Fв predictфункцию? Если каким-то образом outputmarginустановлено значение T, оно вернет значение до логистического преобразования.
инверсия
1
Для Python вы можете скопировать predict_probaреализацию из sklearnAPI: github.com/dmlc/xgboost/blob/master/python-package/xgboost/…
Антон Тарасенко

Ответы:

14

Знайте, я немного опоздал, но чтобы получить вероятности от xgboostвас, необходимо указать multi:softmaxцель следующим образом:

xgboost(param, data = x_mat, label = y_mat,nround = 3000, objective='multi:softprob')

Из ?xgb.train:

multi: softprob аналогичен softmax, но выдает вектор ndata * nclass, который может быть преобразован в матрицу ndata, nclass. Результат содержит прогнозируемые вероятности каждой точки данных, принадлежащей каждому классу.

cyberj0g
источник
2
Благодарю. Чем эта функция потерь отличается от двоичной: логистика для двоичной классификации?
GeorgeOfTheRF
3
Это просто обобщение логистической функции для случая нескольких классов, не должно быть никакой существенной разницы.
cyberj0g
14

Просто используйте predict_probaвместо predict. Вы можете оставить цель как binary:logistic.

ihadanny
источник
3
Если бы это был Python, а не R, то этот ответ мог бы быть разумным. Неправильный язык.
B_Miner
1
упс! спасибо @B_Miner. Я не удаляю этот ответ, так как он может быть полезен для других, которые
допустят
Для меня это не сработает datascience.stackexchange.com/questions/14527/…
Георг Хейлер
4
У xgboost нет функции предиката_проба
Ашока Лелла
1
Классификатор XGBoost имеет параметр предиката_процесса xgboost.readthedocs.io/en/latest/python/python_api.html
Пол Бендевис,
0

после прогноза

pred_s <- predict(bst, x_mat_s2)

Вы можете получить вероятность путем

pred_s$data

Если это бинарная классификация, то pred_s$dataвключает в себя prob.0, prob.1, ответ.

Таким образом, вы можете получить

pred_s$data$prob.1
Дера
источник