Как сохранить копию генератора как StratifierKfold - PullRequest
0 голосов
/ 26 октября 2018

Я выполняю на своем ноутбуке следующие команды в двух разных ячейках:

  • skf = StratifiedKFold(n_splits = 4).split(X,Y)
  • regrl = LinearRegression() mse = np.mean(cross_val_score(regrl, X, Y, cv = skf, scoring = 'mean_squared_error'))

первое выполнениеcross_val_score продолжить без ошибок, но вторая попытка вернет:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-48-de4073ce654d> in <module>
      2 
      3 
----> 4     mse = np.mean(cross_val_score(regrl, X, Y, cv = skf, scoring = 'mean_squared_error'))
      5 mse

/opt/conda/lib/python3.6/site-packages/sklearn/model_selection/_validation.py in cross_val_score(estimator, X, y, groups, scoring, cv, n_jobs, verbose, fit_params, pre_dispatch)
    340                                 n_jobs=n_jobs, verbose=verbose,
    341                                 fit_params=fit_params,
--> 342                                 pre_dispatch=pre_dispatch)
    343     return cv_results['test_score']
    344 

/opt/conda/lib/python3.6/site-packages/sklearn/model_selection/_validation.py in cross_validate(estimator, X, y, groups, scoring, cv, n_jobs, verbose, fit_params, pre_dispatch, return_train_score)
    210         train_scores = _aggregate_score_dicts(train_scores)
    211     else:
--> 212         test_scores, fit_times, score_times = zip(*scores)
    213     test_scores = _aggregate_score_dicts(test_scores)
    214 

ValueError: not enough values to unpack (expected 3, got 0)

Если я выполню снова: skf = StratifiedKFold(n_splits = 4).split(X,Y) ошибка не возвращается, генератор skf станет пустым после использования.Поэтому я бы знал, как получить копию генератора.

Потому что мне нужно попробовать много моделей в цикле, но в настоящее время мне приходится обновлять skf для каждой итерации, и это занимает слишком много времени.

1 Ответ

0 голосов
/ 26 октября 2018

Вместо этого:

skf = StratifiedKFold(n_splits = 4).split(X,Y)
cross_val_score(regrl, X, Y, cv = skf, ...)

, где skf является генератором, как вы заметили, и будет выполняться только один раз.

Вы можете сделать это:

from sklearn.model_selection import StratifiedKFold, cross_val_score

skf = StratifiedKFold(n_splits = 4)
cross_val_score(regrl, X, Y, cv = skf, ...)

Здесь skf - это StratifiedKFold объект, а не генератор, как ваш код.

cross_val_score (В более новыхверсии scikit-learn> 0.18 из пакета model_selection) могут автоматически вызывать split() на итераторе сгиба с предоставленными данными (X, y) всякий раз, когда это требуется.Так что вам не нужно выполнять это явно.

...