Machine learning 我应该先执行交叉验证,然后再执行网格搜索吗?

Machine learning 我应该先执行交叉验证,然后再执行网格搜索吗?,machine-learning,scikit-learn,cross-validation,grid-search,Machine Learning,Scikit Learn,Cross Validation,Grid Search,我是机器学习领域的新手。我的问题是:我已经建立了一个模型,我正在尝试优化这样的模型。通过做一些研究,我发现交叉验证可以帮助我避免过度拟合模型。此外,Gridsearchcv可用于帮助我优化此类模型的参数,并最终确定最佳参数 现在我的问题是,我应该先进行交叉验证,然后使用网格搜索来确定最佳参数,还是使用GridsearchCV就足够了,因为它本身执行交叉验证?请参阅 我的建议是,如果您的数据集足够大: 将数据集拆分为训练和测试子集 在训练数据集上执行一次测试 在测试子集上评估最佳模型(来自Grid

我是机器学习领域的新手。我的问题是:我已经建立了一个模型,我正在尝试优化这样的模型。通过做一些研究,我发现交叉验证可以帮助我避免过度拟合模型。此外,Gridsearchcv可用于帮助我优化此类模型的参数,并最终确定最佳参数

现在我的问题是,我应该先进行交叉验证,然后使用网格搜索来确定最佳参数,还是使用GridsearchCV就足够了,因为它本身执行交叉验证?

请参阅

我的建议是,如果您的数据集足够大:

  • 将数据集拆分为训练和测试子集
  • 在训练数据集上执行一次测试
  • 在测试子集上评估最佳模型(来自GridSearchCV)
  • 现在我的问题是,我应该先进行交叉验证,然后使用网格搜索来确定最佳参数,还是使用GridsearchCV就足够了,因为它本身执行交叉验证


    第二个。GridSearchCV使用交叉验证拆分策略来选择最佳参数。如果阅读,则有一个名为“cv”的参数,默认情况下,它定义了5倍交叉验证。如果您需要使用另一种交叉验证策略,可以按照@Noki的建议为其提供一个int、交叉验证生成器或iterable,您可以在Grid Search cv中使用cv参数

    GridSearchCV(estimator, param_grid, scoring=None, n_jobs=None, iid='deprecated', 
    refit=True, cv=None, verbose=0, 
    pre_dispatch='2*n_jobs',error_score=nan,return_train_score=False)
    
    此外,文档明确指出,如果是分类问题,它将自动确保分层

    对于整数/无输入,如果估计器是分类器且y是二进制或 使用多层层状褶皱。在所有其他情况下,使用KFold

    不过,我想补充一点: 您可以根据Y_目标变量的值计数使K倍动态。 您不能将您的频率最低计数(K倍)设为1,它将在训练时抛出错误。我碰巧遇到了这个问题。请使用下面的代码片段来帮助您实现这一点

    比如说

    import pandas as pd
    Y_target=pd.Series([0,1,1,1,1,0,0,0,6,6,6,6,6,6,6,6,6])
    
    if Y_target.value_counts().iloc[-1]<2:
        raise Exception ("No value can have frequency count as 1 in Y-target")
    else:
        Kfold=Y_target.value_counts().iloc[-1]
    
    将熊猫作为pd导入
    Y_目标=pd.系列([0,1,1,1,0,0,0,6,6,6,6,6,6])
    
    如果Y_target.value_counts().iloc[-1]使用交叉验证将我的数据拆分为培训和测试,而不是使用拆分(例如80%培训和20%测试)?如果您有足够的数据,请在GridSearchCV之前将数据集拆分为培训和测试。请参见此处的示例:感谢您提供的信息,我将使用交叉验证分割数据,然后,我将根据这些数据对此类模型进行训练,并最终使用GridSearchCV(通过指定相同的折叠次数)来识别模型可能采用的不同参数。你认为这是一个好方法吗?因此,如果网格搜索也执行CV,那么就不需要预先分割数据了,对吗?是的,你最多可以进行80-20次分割(或10次或其他任何一次)如果你想使用20作为验证数据集,并且更安全地保证你的模型能够很好地推广。我的问题是一个多类分类问题,所以最好使用分层的k折叠而不是普通的k折叠?如果是,为什么会这样?因为我找不到与此相关的任何内容。是的,最好使用分层K-fold,因为它将确保您的训练集和测试集之间的数据比率保持不变。如果您在GridSearch CV中这样做,它将自动处理。使用上面的代码片段确定折叠。取相同的值或小于变量K-fold值的任何值。没有问题。