MCPcopy Create free account
hub / github.com/antmachineintelligence/mtgbmcode / _make_n_folds

Function _make_n_folds

python-package/lightgbmmt/engine.py:298–353  ·  view source on GitHub ↗

Make a n-fold list of Booster from random indices.

(full_data, folds, nfold, params, seed, fpreproc=None, stratified=True,
                  shuffle=True, eval_train_metric=False)

Source from the content-addressed store, hash-verified

296
297
298def _make_n_folds(full_data, folds, nfold, params, seed, fpreproc=None, stratified=True,
299 shuffle=True, eval_train_metric=False):
300 """Make a n-fold list of Booster from random indices."""
301 full_data = full_data.construct()
302 num_data = full_data.num_data()
303 if folds is not None:
304 if not hasattr(folds, '__iter__') and not hasattr(folds, 'split'):
305 raise AttributeError("folds should be a generator or iterator of (train_idx, test_idx) tuples "
306 "or scikit-learn splitter object with split method")
307 if hasattr(folds, 'split'):
308 group_info = full_data.get_group()
309 if group_info is not None:
310 group_info = np.array(group_info, dtype=np.int32, copy=False)
311 flatted_group = np.repeat(range_(len(group_info)), repeats=group_info)
312 else:
313 flatted_group = np.zeros(num_data, dtype=np.int32)
314 folds = folds.split(X=np.zeros(num_data), y=full_data.get_label(), groups=flatted_group)
315 else:
316 if any(params.get(obj_alias, "") == "lambdarank" for obj_alias in _ConfigAliases.get("objective")):
317 if not SKLEARN_INSTALLED:
318 raise LightGBMError('Scikit-learn is required for lambdarank cv.')
319 # lambdarank task, split according to groups
320 group_info = np.array(full_data.get_group(), dtype=np.int32, copy=False)
321 flatted_group = np.repeat(range_(len(group_info)), repeats=group_info)
322 group_kfold = _LGBMGroupKFold(n_splits=nfold)
323 folds = group_kfold.split(X=np.zeros(num_data), groups=flatted_group)
324 elif stratified:
325 if not SKLEARN_INSTALLED:
326 raise LightGBMError('Scikit-learn is required for stratified cv.')
327 skf = _LGBMStratifiedKFold(n_splits=nfold, shuffle=shuffle, random_state=seed)
328 folds = skf.split(X=np.zeros(num_data), y=full_data.get_label())
329 else:
330 if shuffle:
331 randidx = np.random.RandomState(seed).permutation(num_data)
332 else:
333 randidx = np.arange(num_data)
334 kstep = int(num_data / nfold)
335 test_id = [randidx[i: i + kstep] for i in range_(0, num_data, kstep)]
336 train_id = [np.concatenate([test_id[i] for i in range_(nfold) if k != i]) for k in range_(nfold)]
337 folds = zip_(train_id, test_id)
338
339 ret = _CVBooster()
340 for train_idx, test_idx in folds:
341 train_set = full_data.subset(sorted(train_idx))
342 valid_set = full_data.subset(sorted(test_idx))
343 # run preprocessing on the data set if needed
344 if fpreproc is not None:
345 train_set, valid_set, tparam = fpreproc(train_set, valid_set, params.copy())
346 else:
347 tparam = params
348 cvbooster = Booster(tparam, train_set)
349 if eval_train_metric:
350 cvbooster.add_valid(train_set, 'train')
351 cvbooster.add_valid(valid_set, 'valid')
352 ret.append(cvbooster)
353 return ret
354
355

Callers 1

cvFunction · 0.85

Calls 12

add_validMethod · 0.95
LightGBMErrorClass · 0.85
_CVBoosterClass · 0.85
constructMethod · 0.80
get_groupMethod · 0.80
arrayMethod · 0.80
get_labelMethod · 0.80
subsetMethod · 0.80
appendMethod · 0.80
BoosterClass · 0.70
num_dataMethod · 0.45
getMethod · 0.45

Tested by

no test coverage detected