2016-01-28 17 views
13

मैं आर में xgboost पैकेज की खोज कर रहे हैं और कई क़ौम के साथ-साथ ट्यूटोरियल लेकिन माध्यम से चला गया में इष्टतम पैरामीटर पास करता है यह अभी भी मुझे confuses: xgb.cv का उपयोग कर ऐसा करने के लिए के बाद क्रॉस सत्यापन, इष्टतम पैरामीटर xgb.train पर कैसे पास हो जाते हैं? या xgb.cv के आउटपुट के आधार पर मुझे आदर्श पैरामीटर (जैसे nround, max.depth) की गणना करनी चाहिए?xgboost: कैसे xgb.cv xgb.train

param <- list("objective" = "multi:softprob", 
       "eval_metric" = "mlogloss", 
       "num_class" = 12) 
cv.nround <- 11 
cv.nfold <- 5 
mdcv <-xgb.cv(data=dtrain,params = param,nthread=6,nfold = cv.nfold,nrounds = cv.nround,verbose = T) 

md <-xgb.train(data=dtrain,params = param,nround = 80,watchlist = list(train=dtrain,test=dtest),nthread=6) 

उत्तर

40

ऐसा लगता है कि xgb.cv गलत समझा है, यह एक पैरामीटर खोज कार्य नहीं है। यह के-फोल्ड क्रॉस सत्यापन करता है, और कुछ नहीं।

अपने कोड में, यह param का मान नहीं बदलता है।

आर के एक्सजीबीओस्ट में सर्वोत्तम पैरामीटर खोजने के लिए, कुछ विधियां हैं। इन 2 तरीकों,

(1) का प्रयोग करें mlr पैकेज, http://mlr-org.github.io/mlr-tutorial/release/html/

एक XGBoost + एमएलआर Kaggle के प्रूडेंशियल चुनौती में example code,

नहीं है लेकिन उस कोड प्रतिगमन, नहीं वर्गीकरण के लिए है। जहां तक ​​मुझे पता है, mlogloss मीट्रिक अभी तक mlr पैकेज में नहीं है, इसलिए आपको अपने आप से स्क्रैच से mlogloss माप को कोड करना होगा। CMIIW।

(2) दूसरी विधि, मैन्युअल रूप से,

param <- list(objective = "multi:softprob", 
     eval_metric = "mlogloss", 
     num_class = 12, 
     max_depth = 8, 
     eta = 0.05, 
     gamma = 0.01, 
     subsample = 0.9, 
     colsample_bytree = 0.8, 
     min_child_weight = 4, 
     max_delta_step = 1 
    ) 
cv.nround = 1000 
cv.nfold = 5 
mdcv <- xgb.cv(data=dtrain, params = param, nthread=6, 
       nfold=cv.nfold, nrounds=cv.nround, 
       verbose = T) 

की स्थापना मापदंडों तो दोहराए जाते हैं, उदाहरण के फिर से, आप सबसे अच्छा (न्यूनतम) mlogloss, लगता है

min_logloss = min(mdcv[, test.mlogloss.mean]) 
min_logloss_index = which.min(mdcv[, test.mlogloss.mean]) 

min_logloss न्यूनतम मूल्य है mlogloss के, जबकि min_logloss_index सूचकांक (गोल) है।

आपको कई बार उपरोक्त प्रक्रिया को दोहराना होगा, प्रत्येक बार पैरामीटर मैन्युअल रूप से बदलें (mlr आपके लिए दोहराना करता है)। अंत तक आपको सर्वश्रेष्ठ वैश्विक न्यूनतम min_logloss मिल जाता है।

नोट: आप इसे 100 या 200 पुनरावृत्तियों के लूप में कर सकते हैं, जिसमें प्रत्येक पुनरावृत्ति के लिए आप पैरामीटर मान को यादृच्छिक रूप से सेट करते हैं। इस तरह, आपको चर या 0 में सर्वश्रेष्ठ [parameters_list, min_logloss, min_logloss_index] को सहेजना होगा।

नोट: बेहतर प्रतिलिपि प्रस्तुत करने योग्य परिणाम के लिए set.seed() द्वारा यादृच्छिक बीज स्थापित करने के लिए। अलग-अलग यादृच्छिक बीज अलग-अलग परिणाम पैदा करते हैं। इसलिए, आपको चर या फ़ाइल में [parameters_list, min_logloss, min_logloss_index, seednumber] को सहेजना होगा।

कहते हैं कि अंत में आपको मिल 3 परिणाम 3 पुनरावृत्तियों/दोहराता में:

min_logloss = 2.1457, min_logloss_index = 840 
min_logloss = 2.2293, min_logloss_index = 920 
min_logloss = 1.9745, min_logloss_index = 780 

तो फिर तुम तीसरे मानकों (यह वैश्विक न्यूनतम 1.9745 की min_logloss है) का उपयोग करना चाहिए। आपका सर्वश्रेष्ठ सूचकांक (मैदान) 780 है।

एक बार जब आप सबसे अच्छा मानकों मिलता है, प्रशिक्षण में इसका इस्तेमाल करते हैं,

# best_param is global best param with minimum min_logloss 
# best_min_logloss_index is the global minimum logloss index 
nround = 780 
md <- xgb.train(data=dtrain, params=best_param, nrounds=nround, nthread=6) 

मैं तुम्हें प्रशिक्षण में watchlist की जरूरत है, क्योंकि आप पार सत्यापन किया है नहीं लगता। लेकिन अगर आप अभी भी watchlist का उपयोग करना चाहते हैं, तो यह ठीक है।

इससे भी बेहतर आप xgb.cv में प्रारंभिक रोक का उपयोग कर सकते हैं।

mdcv <- xgb.cv(data=dtrain, params=param, nthread=6, 
       nfold=cv.nfold, nrounds=cv.nround, 
       verbose = T, early.stop.round=8, maximize=FALSE) 
इस कोड के साथ

, जब mlogloss मूल्य 8 चरणों में कम हो रही है, xgb.cv बंद हो जाएगा। आप समय बचा सकते हैं। आपको maximizeFALSE पर सेट करना होगा, क्योंकि आप न्यूनतम mlogloss की अपेक्षा करते हैं।

यहां 100 पुनरावृत्तियों लूप और यादृच्छिक चुने गए पैरामीटर के साथ एक उदाहरण कोड है।

best_param = list() 
best_seednumber = 1234 
best_logloss = Inf 
best_logloss_index = 0 

for (iter in 1:100) { 
    param <- list(objective = "multi:softprob", 
      eval_metric = "mlogloss", 
      num_class = 12, 
      max_depth = sample(6:10, 1), 
      eta = runif(1, .01, .3), 
      gamma = runif(1, 0.0, 0.2), 
      subsample = runif(1, .6, .9), 
      colsample_bytree = runif(1, .5, .8), 
      min_child_weight = sample(1:40, 1), 
      max_delta_step = sample(1:10, 1) 
     ) 
    cv.nround = 1000 
    cv.nfold = 5 
    seed.number = sample.int(10000, 1)[[1]] 
    set.seed(seed.number) 
    mdcv <- xgb.cv(data=dtrain, params = param, nthread=6, 
        nfold=cv.nfold, nrounds=cv.nround, 
        verbose = T, early.stop.round=8, maximize=FALSE) 

    min_logloss = min(mdcv[, test.mlogloss.mean]) 
    min_logloss_index = which.min(mdcv[, test.mlogloss.mean]) 

    if (min_logloss < best_logloss) { 
     best_logloss = min_logloss 
     best_logloss_index = min_logloss_index 
     best_seednumber = seed.number 
     best_param = param 
    } 
} 

nround = best_logloss_index 
set.seed(best_seednumber) 
md <- xgb.train(data=dtrain, params=best_param, nrounds=nround, nthread=6) 

इस कोड के साथ, आप यादृच्छिक पैरामीटर के साथ हर बार पार सत्यापन 100 बार चलाते हैं। फिर आपको सबसे अच्छा पैरामीटर सेट मिलता है, जो कम से कम min_logloss के साथ पुनरावृत्ति में होता है।

early.stop.round के मूल्य को बढ़ाएं यदि आपको पता चलता है कि यह बहुत छोटा है (बहुत जल्दी रोक रहा है)। आपको अपनी डेटा विशेषताओं के आधार पर यादृच्छिक पैरामीटर मानों की सीमा को भी बदलने की आवश्यकता है।

और, 100 या 200 पुनरावृत्तियों के लिए, मुझे लगता है कि आप verbose को FALSE में बदलना चाहते हैं।

साइड नोट: यह यादृच्छिक विधि का उदाहरण है, आप इसे समायोजित कर सकते हैं उदा। बेहतर विधि के लिए Bayesian अनुकूलन द्वारा। यदि आपके पास XGBoost का पायथन संस्करण है, तो Bayesian अनुकूलन का उपयोग करके सेट किए गए सर्वोत्तम पैरामीटर खोजने के लिए XGBoost, https://github.com/mpearmain/BayesBoost के लिए एक अच्छी हाइपरपेरामीटर स्क्रिप्ट है।

संपादित करें: मैं Kaggle forum में "डेवट पोलैट" एक कगल मास्टर द्वारा पोस्ट की गई तीसरी मैन्युअल विधि जोड़ना चाहता हूं।

संपादित करें: आप अजगर और sklearn जानते हैं, तो आप भी xgboost.XGBClassifier या xgboost.XGBRegressor

के साथ GridSearchCV उपयोग कर सकते हैं
+0

, विस्तृत उत्तर के लिए धन्यवाद एक पाठ्यपुस्तक पढ़ने की तरह था! तो इस मामले में सीवी का एकमात्र उद्देश्य आपके लिए आधार चुनना है, क्या यह सही है? – snowneji

+0

@snowneji, हां, ऐसा कुछ कहा जा सकता है, कुछ पैरामीटर सेट के आधार पर सर्वोत्तम आधार चुनने के लिए। क्योंकि, बहुत छोटे मैदान अंडरफिटिंग कर रहे हैं, और बहुत बड़े मैदान अधिक उपयुक्त हैं। बीटीडब्ल्यू, अगर आपको पता चला कि मेरा जवाब उपयोगी है, तो कृपया इसे स्वीकार करें, धन्यवाद। – silo

+0

ठीक है, धन्यवाद! – snowneji

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