【问题标题】:How to keep a copy of generator like StratifierKfold如何保留像 StratifiedKfold 这样的生成器的副本
【发布时间】:2023-03-12 12:28:01
【问题描述】:

我在笔记本上的两个不同单元格中执行以下命令:

  • 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,而且时间太长了。

【问题讨论】:

    标签: python-3.x scikit-learn cross-validation


    【解决方案1】:

    而不是这样做:

    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 包)可以在需要时使用提供的数据 (X, y) 在折叠迭代器上自动调用 split()。所以你不必明确地执行。

    【讨论】:

    • 我的StratifiedKfold也有同样的问题,无法复制,使用后变空
    • @lelchim 你按照我的建议做了吗?从您的代码中删除 .split(X, y)
    • 我刚刚做到了,即使对于 stratifiedShuffleSplit 也能正常工作!完美
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多