为什么在将StratifiedKFold()作为GridSearchCV的参数传递时调用split()函数?

为什么在将StratifiedKFold()作为GridSearchCV的参数传递时调用split()函数?,split,cross-validation,grid-search,gridsearchcv,k-fold,Split,Cross Validation,Grid Search,Gridsearchcv,K Fold,我想做什么? 我试图在GridSearchCV()中使用StratifiedKFold() 那么,什么让我困惑呢? 当我们使用K折叠交叉验证时,我们只需传递GridSearchCV()中的CV数,如下所示 grid_search_m = GridSearchCV(rdm_forest_clf, param_grid, cv=5, scoring='f1', return_train_score=True, n_jobs=2) 然后,当我需要使用StratifiedKFold()时,我认为过程应

我想做什么?

我试图在
GridSearchCV()
中使用
StratifiedKFold()

那么,什么让我困惑呢?

当我们使用K折叠交叉验证时,我们只需传递
GridSearchCV()
中的CV数,如下所示

grid_search_m = GridSearchCV(rdm_forest_clf, param_grid, cv=5, scoring='f1', return_train_score=True, n_jobs=2)
然后,当我需要使用
StratifiedKFold()
时,我认为过程应该保持不变。也就是说,只将拆分的数量设置为-
StratifiedKFold(n_splits=5)
cv

grid_search_m = GridSearchCV(rdm_forest_clf, param_grid, cv=StratifiedKFold(n_splits=5), scoring='f1', return_train_score=True, n_jobs=2)
但是说

无论使用什么,所需要的只是 按照建议,使用功能拆分提供发电机:

kfolds = StratifiedKFold(5)
clf = GridSearchCV(estimator, parameters, scoring=qwk, cv=kfolds.split(xtrain,ytrain))
clf.fit(xtrain, ytrain)
此外,的一个答案也建议这样做。这意味着,他们建议在使用
GridSearchCV()时调用split函数:
StratifiedKFold(n\u splits=5)。split(xtrain,ytrain)
。但是,我发现调用
split()
和不调用
split()
会给我相同的f1分数

因此,我的问题

  • 我不明白为什么我们需要在分层K折叠过程中调用
    split()
    函数 在K折叠CV期间,我们不需要做此类事情

  • 如果调用了
    split()?也就是说,我想知道
    GridSearchCV()
    将如何使用这些索引


基本上GridSearchCV很聪明,可以为cv参数选择多个选项—数字、拆分索引的迭代器或具有拆分函数的对象。您可以查看下面复制的代码

cv = 5 if cv is None else cv
if isinstance(cv, numbers.Integral):
    if (classifier and (y is not None) and
            (type_of_target(y) in ('binary', 'multiclass'))):
        return StratifiedKFold(cv)
    else:
        return KFold(cv)

if not hasattr(cv, 'split') or isinstance(cv, str):
    if not isinstance(cv, Iterable) or isinstance(cv, str):
        raise ValueError("Expected cv as an integer, cross-validation "
                         "object (from sklearn.model_selection) "
                         "or an iterable. Got %s." % cv)
    return _CVIterableWrapper(cv)

return cv  # New style cv objects are passed without any modification
基本上,如果你没有通过任何考试,它会使用一个带5的KFold。如果这是一个分类问题,并且目标是二进制/多类,那么它还可以自动使用StratifedKFold

如果你用一个分割函数传递一个对象,它只会使用这个函数。如果你没有传递任何一个,但是传递了一个iterable,它会假设这是一个分裂索引的iterable,并为你包装它

因此,在您的情况下,假设这是一个具有二进制/多类目标的分类问题,下面所有内容将给出完全相同的结果/拆分-无论您使用哪一个

cv=5
cv=StratifiedKFold(5)
cv=StratifiedKFold(5).split(xtrain,ytrain)

谢谢你的回复。你说过“如果你用一个拆分函数传递一个对象,它就会使用它。”但我不明白“GridSearchCV()将如何使用那些通过拆分找到的索引?”你能描述一下吗?所以对于网格搜索中设置的每个参数,它将使用拆分来运行交叉验证-因此,如果在参数网格(6组)中有2个参数的3个选项,以及5个交叉验证,那么实际上您可以训练和验证30个模型。然后,交叉验证运行中平均验证分数最高的参数集被选为“最佳”