2011-12-07 21 views
7

Esperaba usar el paquete GBM para hacer la regresión logística, pero está dando respuestas ligeramente fuera del rango 0-1. Probé los parámetros de distribución sugeridos para las predicciones 0-1 (bernoulli y adaboost), pero eso empeora las cosas en comparación con el gaussian.R gbm regresión logística

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 

Bernoulli:

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 

Y 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 

estoy haciendo algo mal, ¿Es necesario preproceso (escala, centro) los datos o tengo que ir y manualmente piso/tapa los valores con algo como:

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

¿Desea compartir su información? – abcde123483

Respuesta

14

De ?predict.gbm:

Devuelve un vector de predicciones. Por defecto, las predicciones están en la escala de f (x). Por ejemplo, para la pérdida de Bernoulli, el valor devuelto está en la escala de log odds, la pérdida de Poisson en la escala de registro, y coxph está en la escala de riesgos del registro.

Si type = "response", entonces gbm vuelve a la misma escala que el resultado. Actualmente, el único efecto que tendrá es la probabilidad de retorno para bernoulli y los conteos esperados para poisson. Para el , otras distribuciones "respuesta" y "enlace" devuelven lo mismo.

tanto, si utiliza distribution="bernoulli", que necesita para transformar los valores pronosticados para reescalar a [0, 1]: p <- plogis(predict.gbm(model)). Usar distribution="gaussian" es realmente para regresión en lugar de clasificación, aunque estoy sorprendido de que las predicciones no estén en [0, 1]: mi entendimiento es que gbm aún está basado en árboles, por lo que los valores predichos no deberían ser capaces de ir fuera de los valores presentes en los datos de entrenamiento.

+0

Gracias, necesitaba cambiar el argumento 'type =' por 'response' en predic.gbm(). – screechOwl

Cuestiones relacionadas