Расчет вероятностей в XGBoost - PullRequest
0 голосов
/ 04 октября 2019

Я начинаю работу с XGBoost в R и пытаюсь сопоставить прогнозы из модели binary: logistic с тем, что сгенерировано с помощью пользовательской функции потери журнала. Я ожидаю, что следующие два вызова прогнозируют для получения одинаковых результатов:

require(xgboost)

loglossobj <- function(preds, dtrain) {
  labels <- getinfo(dtrain, "label")
  preds <- 1/(1 + exp(-preds))
  grad <- preds - labels
  hess <- preds * (1 - preds)
  return(list(grad = grad, hess = hess))
}

data(agaricus.train, package='xgboost')
data(agaricus.test, package='xgboost')
train<-agaricus.train
test<-agaricus.test

model<-xgboost(data = train$data, label = train$label, nrounds=2,objective="binary:logistic")
preds = predict(model,test$data)
print (head(preds))

model<-xgboost(data = train$data, label = train$label, nrounds=2,objective=loglossobj, eval_metric = "error")
preds = predict(model,test$data)
x = 1 / (1+exp(-preds))
print (head(x))

Вывод модели из пользовательской функции потери журнала не имеет логистического преобразования 1 / (1+ exp (-x)) применяется. Тем не менее, если я сделаю это, результирующие вероятности будут разными между двумя вызовами предиката :

[1] 0.2582498 0.7433221 0.2582498 0.2582498 0.2576509 0.2750908

против


[1] 0.3076240 0.7995583 0.3076240 0.3076240 0.3079328 0.3231709

Я уверен, что есть простойобъяснение. Есть предложения?

1 Ответ

0 голосов
/ 07 октября 2019

Оказывается, такое поведение связано с начальными условиями. xgboost неявно предполагает base_score = 0,5 при вызове двоичного: логистика или двоичного: logit_raw , но base_score должно быть установлено равным 0,0, чтобы реплицировать их вывод при использовании пользовательских потерьфункция. Здесь base_score - это начальная оценка предсказания для всех экземпляров.

Для иллюстрации следующий код R генерирует одинаковые предсказания во всех трех случаях:

require(xgboost)

loglossobj <- function(preds, dtrain) {
  labels <- getinfo(dtrain, "label")
  preds <- 1/(1 + exp(-preds))
  grad <- preds - labels
  hess <- preds * (1 - preds)
  return(list(grad = grad, hess = hess))
}

data(agaricus.train, package='xgboost')
data(agaricus.test, package='xgboost')
train<-agaricus.train
test<-agaricus.test

model<-xgboost(data = train$data, label = train$label, objective = "binary:logistic", nround = 10, eta = 0.1, verbose=0)
preds = predict(model,test$data)
print (head(preds))

model<-xgboost(data = train$data, label = train$label, objective = "binary:logitraw", nround = 10, eta = 0.1, verbose=0)
preds = predict(model,test$data)
x = 1 / (1+exp(-preds))
print (head(x))

model<-xgboost(data = train$data, label = train$label, objective = loglossobj, base_score = 0.0, nround = 10, eta = 0.1, verbose=0)
preds = predict(model,test$data)
x = 1 / (1+exp(-preds))
print (head(x))

, который выдает

[1] 0.1814032 0.8204284 0.1814032 0.1814032 0.1837782 0.1952717
[1] 0.1814032 0.8204284 0.1814032 0.1814032 0.1837782 0.1952717
[1] 0.1814032 0.8204284 0.1814032 0.1814032 0.1837782 0.1952717
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...