R gbm логистическая регрессия - PullRequest
8 голосов
/ 07 декабря 2011

Я надеялся использовать пакет GBM для логистической регрессии, но он дает ответы немного за пределами диапазона 0-1.Я пробовал предложенные параметры распределения для прогнозов 0-1 (bernoulli и adaboost), но это на самом деле усугубляет ситуацию при использовании gaussian.

GBM_NTREES = 150
GBM_SHRINKAGE = 0.1
GBM_DEPTH = 4
GBM_MINOBS = 50
> GBM_model <- gbm.fit(
+ x = trainDescr 
+ ,y = trainClass 
+ ,distribution = "gaussian"
+ ,n.trees = GBM_NTREES
+ ,shrinkage = GBM_SHRINKAGE
+ ,interaction.depth = GBM_DEPTH
+ ,n.minobsinnode = GBM_MINOBS
+ ,verbose = TRUE)
Iter   TrainDeviance   ValidDeviance   StepSize   Improve
     1        0.0603             nan     0.1000    0.0019
     2        0.0588             nan     0.1000    0.0016
     3        0.0575             nan     0.1000    0.0013
     4        0.0563             nan     0.1000    0.0011
     5        0.0553             nan     0.1000    0.0010
     6        0.0546             nan     0.1000    0.0008
     7        0.0539             nan     0.1000    0.0007
     8        0.0533             nan     0.1000    0.0006
     9        0.0528             nan     0.1000    0.0005
    10        0.0524             nan     0.1000    0.0004
   100        0.0484             nan     0.1000    0.0000
   150        0.0481             nan     0.1000   -0.0000
> prediction <- predict.gbm(object = GBM_model
+ ,newdata = testDescr
+ ,GBM_NTREES)
> hist(prediction)
> range(prediction)
[1] -0.02945224  1.00706700

Бернулли:

GBM_model <- gbm.fit(
x = trainDescr 
,y = trainClass 
,distribution = "bernoulli"
,n.trees = GBM_NTREES
,shrinkage = GBM_SHRINKAGE
,interaction.depth = GBM_DEPTH
,n.minobsinnode = GBM_MINOBS
,verbose = TRUE)
prediction <- predict.gbm(object = GBM_model
+ ,newdata = testDescr
+ ,GBM_NTREES)
> hist(prediction)
> range(prediction)
[1] -4.699324  3.043440

И adaboost:

GBM_model <- gbm.fit(
x = trainDescr 
,y = trainClass 
,distribution = "adaboost"
,n.trees = GBM_NTREES
,shrinkage = GBM_SHRINKAGE
,interaction.depth = GBM_DEPTH
,n.minobsinnode = GBM_MINOBS
,verbose = TRUE)
> prediction <- predict.gbm(object = GBM_model
+ ,newdata = testDescr
+ ,GBM_NTREES)
> hist(prediction)
> range(prediction)
[1] -3.0374228  0.9323279

Я делаю что-то не так, мне нужно предварительно обработать (масштабировать, отцентрировать) данные или мне нужно войти и вручную напечатать / ограничить значения с помощьючто-то вроде:

prediction <- ifelse(prediction < 0, 0, prediction)
prediction <- ifelse(prediction > 1, 1, prediction)

1 Ответ

15 голосов
/ 07 декабря 2011

С ?predict.gbm:

Возвращает вектор предсказаний. По умолчанию прогнозы находятся в масштабе f (x). Например, для потери Бернулли возвращаемое значение находится на шкале логарифмов, потери Пуассона на шкале логарифмов и coxph находится на шкале опасности бревен.

Если type = "response", тогда gbm преобразуется обратно в тот же масштаб, что и результат. В настоящее время единственный Эффект, который это даст, - это возвращение вероятностей для Бернулли и ожидаемых значений для Пуассона. Для другие дистрибутивы "response" и "link" возвращают то же самое.

Поэтому, если вы используете distribution="bernoulli", вам необходимо преобразовать прогнозируемые значения, чтобы изменить их масштаб до [0, 1]: p <- plogis(predict.gbm(model)). Использование distribution="gaussian" действительно для регрессии, а не для классификации, хотя я удивлен, что прогнозы не в [0, 1]: я понимаю, что gbm все еще основан на деревьях, поэтому прогнозируемые значения не возможность выйти за пределы значений, присутствующих в данных обучения.

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