2011-12-07 19 views
7

मैं 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 

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 

और 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 

हूँ मैं कुछ गलत कर, मैं preprocess (पैमाने, बीच में) करने के लिए डेटा की जरूरत है या मैं जाने की जरूरत है क्या करते इन्हें मैन्युअल रूप से फ़्लोर/कैप करें जैसे कि

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

अपना डेटा साझा करने के लिए देखभाल? – abcde123483

उत्तर

14

?predict.gbm से:

भविष्यवाणियों का एक वेक्टर लौटाता है। डिफ़ॉल्ट रूप से पूर्वानुमान एफ (एक्स) के पैमाने पर हैं। उदाहरण के लिए, बर्नौली के नुकसान के लिए लौटा हुआ मूल्य लॉग बाधा पैमाने पर है, लॉग पैमाने पर poisson हानि, और कॉक्स लॉग लॉग खतरे पैमाने पर है।

यदि टाइप = "प्रतिक्रिया" तो जीबीएम परिणाम के समान पैमाने पर वापस परिवर्तित हो जाता है। वर्तमान में केवल प्रभाव में यह बर्नौली के लिए संभावित संभावनाएं और पोइसन के लिए अपेक्षित मायने रखती हैं। अन्य वितरण "प्रतिक्रिया" और "लिंक" के लिए वही लौटाएं। p <- plogis(predict.gbm(model)):

तो अगर आप distribution="bernoulli" उपयोग करते हैं, आप उन्हें [0, 1] rescale की भविष्यवाणी मूल्यों को बदलने की जरूरत है। वर्गीकरण के विरोध में distribution="gaussian" का उपयोग वास्तव में प्रतिगमन के लिए है, हालांकि मुझे आश्चर्य है कि भविष्यवाणियां [0, 1] में नहीं हैं: मेरी समझ यह है कि जीबीएम अभी भी पेड़ों पर आधारित है, इसलिए भविष्यवाणी मूल्यों को सक्षम नहीं होना चाहिए प्रशिक्षण डेटा में मौजूद मूल्यों के बाहर जाएं।

+0

धन्यवाद, मुझे predict.gbm() में 'type =' तर्क को 'प्रतिक्रिया' में बदलने की आवश्यकता है। – screechOwl

संबंधित मुद्दे