【问题标题】:Splitting a data set for K-fold Cross Validation in Sci-Kit Learn在 Sci-Kit Learn 中拆分数据集以进行 K 折交叉验证
【发布时间】:2020-03-08 08:02:43
【问题描述】:

我被分配了一项任务,该任务需要创建决策树分类器并使用训练集和 10 折交叉验证来确定准确率。我查看了cross_val_predict 的文档,因为我相信这是我需要的模块。

我遇到的问题是数据集的拆分。据我所知,在通常情况下,train_test_split() 方法用于将数据集拆分为 2 - train 和 test。据我了解,对于 K 折验证,您需要将训练集进一步拆分为 K 个部分。

我的问题是:我需要将一开始的数据集分成train和test,还是不需要?

【问题讨论】:

    标签: python machine-learning scikit-learn decision-tree k-fold


    【解决方案1】:

    这取决于。我个人的意见是,您必须将数据集拆分为训练集和测试集,然后您可以使用 K-folds 对您的训练集进行交叉验证。为什么 ?因为在训练后测试并在未见过的示例上微调模型很有趣。

    但有些人只是做交叉验证。这是我经常使用的工作流程:

    # Data Partition
    X_train, X_valid, Y_train, Y_valid = model_selection.train_test_split(X, Y, test_size=0.2, random_state=21)
    
    # Cross validation on multiple model to see which models gives the best results
    print('Start cross val')
    cv_score = cross_val_score(model, X_train, Y_train, scoring=metric, cv=5)
    # Then visualize the score you just obtain using mean, std or plot
    print('Mean CV-score : ' + str(cv_score.mean()))
    
    # Then I tune the hyper parameters of the best (or top-n best) model using an other cross-val
    for param in my_param:
        model = model_with_param
        cv_score = cross_val_score(model, X_train, Y_train, scoring=metric, cv=5)
        print('Mean CV-score with param: ' + str(cv_score.mean()))
    
    # Now I have best parameters for the model, I can train the final model
    model = model_with_best_parameters
    model.fit(X_train, y_train)
    
    # And finally test your tuned model on the test set
    y_pred = model.predict(X_test)
    plot_or_print_metric(y_pred, y_test)
    

    【讨论】:

    • 所以,据我了解,cross_val_score 对每次迭代(从 1 到 K )?
    • 不,我写的工作流更多是为了找到我将用于我的问题的模型。我使用cross_val_score 在K-1 fold 上进行训练并在K-th 折叠上进行测试。因此,我有 K 分数,它很好地表示了模型在数据集上的表现。然后,我使用另一个 cross_val_score 来找到我想要使用的模型的最佳参数。完成后,我使用整个训练集进行最后一次训练,然后我可以使用我的测试集对其进行测试。是不是更清楚了?
    • 是的,我的评论的意思是,你提到的 K-1 fold 上的 train,一开始类似于简单 train set 上的 fit,而 K-1 fold 上的 test th fold 类似于简单测试集上的预测。不过我可能完全理解错了!
    • 嗨,您能回答我这个问题吗:在您的代码中,您提到了一个名为“my_param”的对象。这是什么?您是否以某种方式从 cross_val_score 中得到它?
    • @thenac 这将是您要使用模型测试的超参数。在网上搜索如何微调超参数,有很多教程:)
    【解决方案2】:

    简短回答:否

    长答案。 如果你想使用K-fold validation,当你最初通常不拆分为train/test。

    有很多方法可以评估模型。最简单的一种是使用train/test 拆分,在train 集合上拟合模型并使用test 进行评估。

    如果你采用交叉验证的方法,那么你直接在每个折叠/迭代过程中进行拟合/评估。


    由你决定选择什么,但我会选择 K-Folds 或 LOOCV。

    K-Folds 过程如图所示(K=5):

    【讨论】:

    • 感谢您的回复!是的,我理解 K 折叠的概念,但是当我研究它时,我偶然发现了这张图片,这让我对最终的评估测试数据感到困惑。我想这只是 K-folds(图像的中间部分)和简单的 train-test split(用于底部黄色的测试数据)的组合(scikit-learn.org/stable/_images/…)
    猜你喜欢
    • 2016-05-12
    • 2020-09-10
    • 2013-05-03
    • 2017-01-11
    • 1970-01-01
    • 2016-08-10
    • 2021-01-25
    • 2022-01-16
    • 1970-01-01
    相关资源
    最近更新 更多