2011-12-07 36 views
7

Tôi đã hy vọng sẽ sử dụng gói GBM để thực hiện hồi quy logistic, nhưng nó đưa ra câu trả lời hơi nằm ngoài phạm vi 0-1. Tôi đã thử các tham số phân phối được đề xuất cho các dự đoán 0-1 (bernoulliadaboost) nhưng điều đó thực sự làm cho mọi việc tồi tệ hơn việc sử dụng gaussian.R gbm hồi quy logistic

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 

Và 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 

Tôi có làm điều gì sai, tôi cần phải xử lý trước (quy mô, trung tâm) dữ liệu hay tôi cần phải đi vào và sàn thủ công/giới hạn các giá trị bằng một cái gì đó như:

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

Chăm sóc chia sẻ dữ liệu của bạn? – abcde123483

Trả lời

14

Từ ?predict.gbm:

Trả lại vectơ dự đoán. Theo mặc định, các dự đoán nằm trên thang tỷ lệ f (x). Ví dụ, cho sự mất mát Bernoulli giá trị trả về là trên thang tỷ lệ chênh lệch log, mất poisson trên thang log, và coxph là trên thang đo nguy cơ log.

Nếu loại = "phản hồi" thì gbm sẽ chuyển về cùng tỷ lệ với kết quả. Hiện tại, hiệu ứng chỉ có thể trả về xác suất cho số lượng bernoulli và số lượng dự kiến ​​cho poisson. Đối với các bản phân phối khác "phản hồi" và "liên kết" trả lại như cũ.

Vì vậy, nếu bạn sử dụng distribution="bernoulli", bạn cần phải chuyển đổi giá trị được dự đoán để rescale chúng thành [0, 1]: p <- plogis(predict.gbm(model)). Sử dụng distribution="gaussian" thực sự là hồi quy ngược lại với phân loại, mặc dù tôi ngạc nhiên rằng các dự đoán không có trong [0, 1]: sự hiểu biết của tôi là gbm vẫn dựa trên cây, vì vậy các giá trị được dự đoán sẽ không thể đi ra ngoài các giá trị có trong dữ liệu huấn luyện.

+0

Cảm ơn, tôi cần phải thay đổi đối số 'type =' thành 'response' trong predict ước.gbm(). – screechOwl

Các vấn đề liên quan