【问题标题】:Perform cross-validation on training or validation partition to tune parameters对训练或验证分区执行交叉验证以调整参数
【发布时间】:2018-09-25 08:23:05
【问题描述】:

我有一个大型数据集,它被分成三个块(train-validate-test)。我想执行交叉验证(CV),因为我有一个大数据集,在整个数据集上执行 CV 需要很长时间。执行 CV 的正确分区是什么?我看过的教程只使用了训练拆分,而其他人只使用了验证拆分,而其他人则使用了整个数据集。

感谢您的任何澄清或帮助。

【问题讨论】:

    标签: machine-learning svm cross-validation training-data


    【解决方案1】:

    为简化起见,我们假设您只有一个超参数。如果你想做交叉验证,你会选择N不同的超参数值,并在训练集上训练N不同的模型。然后,您将选择在验证集上具有最佳性能的超参数。然后,您将使用选定的超参数使用训练集和验证集重新训练模型。然后在测试集上评估模型性能。

    如果您的数据集很大,您可以选择一个小子集,找到最佳超参数并继续增加子集,直到您可以推断出在您的完整数据集大小下最佳超参数是什么。在实践中,您通常可以避免选择尽可能大的子集,而只需使用该子集的最佳超参数即可。

    编辑:

    如果您使用 scikit-learn,以下是带有超参数 C 的假设 model 的伪代码:

    from sklearn.model_selection import GridSearchCV
    
    # X_train, X_test are the train and test features
    # Y_train, Y_test are the corresponding labels/values to predict.
    # model is some scikit-learn regression or classification model
    
    # Create a parameter grid
    param_grid = {'C': [0.1, 1, 5, 15, 100]}
    
    # Do two fold CV. You can do other types of CV as well by passing
    # a cross-validation generator
    estimator = GridSearchCV(model, cv=2, param_grid=param_grid)
    # Do the cross validation procedure explained below
    estimator.fit(X_train, Y_train)
    

    当您运行 fit 方法时,您将训练集 (X_train, Y_train) 分成两部分。然后,您使用前半部分数据使用C=0.1 训练模型,并在后半部分对性能进行评分。在这种情况下,前半部分是训练集,后半部分是验证集。之后,您重复该过程,但使用后半部分作为训练集,前半部分作为验证集。然后对性能进行平均并存储。

    然后对C 的剩余值重复此过程。然后你检查哪个 C 值给出了最好的预测精度。然后使用该值使用整个训练集 (X_train, Y_train) 训练最终模型。然后可以通过

    在遗漏的测试集上评估模型性能
    score = estimator.score(X_test, Y_test)
    

    【讨论】:

    • 可以多解释一下这部分“然后你会选择在验证集上表现最好的超参数。” “在验证集上”是什么意思,我是重新训练还是只用验证集上的最佳参数测试经过训练的模型?我正在使用 Sklearn GridSearchCV 来调整参数。谢谢
    • @user3446905 我使用 scikit-learn 添加了一个代码示例。希望它能解释幕后发生的事情。
    • 非常感谢。在示例中您使用了训练和测试拆分,但我真的不明白何时使用验证拆分?
    • 当您调用GridSearchCVfit 方法时,内部会使用验证拆分,因此如果您使用该对象,则无需自己进行验证拆分。验证集用作测试集来判断样本外性能并选择最佳模型/超参数。但是,通过使用验证集来选择您已污染的模型,将其用作测试集,而您可以使用以前的训练+验证集作为新的更大的训练集,并在单独的测试集上测量模型性能。
    • 我明白了,但我正在使用三拆分数据,它已经有三个拆分。这是否意味着我应该合并训练和验证,然后对它们调用 fit 方法?谢谢。
    猜你喜欢
    • 2021-12-10
    • 1970-01-01
    • 2014-05-01
    • 2016-01-29
    • 2016-06-24
    • 1970-01-01
    • 2011-12-16
    • 2016-02-25
    • 2018-05-03
    相关资源
    最近更新 更多