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)
| 296 | |
| 297 | |
| 298 | def _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 |
no test coverage detected