ऐसा लगता है कि 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
बंद हो जाएगा। आप समय बचा सकते हैं। आपको maximize
FALSE
पर सेट करना होगा, क्योंकि आप न्यूनतम 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 उपयोग कर सकते हैं
, विस्तृत उत्तर के लिए धन्यवाद एक पाठ्यपुस्तक पढ़ने की तरह था! तो इस मामले में सीवी का एकमात्र उद्देश्य आपके लिए आधार चुनना है, क्या यह सही है? – snowneji
@snowneji, हां, ऐसा कुछ कहा जा सकता है, कुछ पैरामीटर सेट के आधार पर सर्वोत्तम आधार चुनने के लिए। क्योंकि, बहुत छोटे मैदान अंडरफिटिंग कर रहे हैं, और बहुत बड़े मैदान अधिक उपयुक्त हैं। बीटीडब्ल्यू, अगर आपको पता चला कि मेरा जवाब उपयोगी है, तो कृपया इसे स्वीकार करें, धन्यवाद। – silo
ठीक है, धन्यवाद! – snowneji