为什么K折交叉验证会构建K+1个模型?

我已经阅读了K折交叉验证的一般步骤,网址是https://machinelearningmastery.com/k-fold-cross-validation/

它描述了一般程序如下:

  1. 随机打乱数据集。
  2. 将数据集分成k组(折)
  3. 对于每个独特的组:将该组作为保留或测试数据集
  4. 将剩余的组作为训练数据集,在训练集上拟合模型并在测试集上评估它
  5. 保留评估分数并丢弃模型
  6. 使用模型评估分数的样本总结模型的技能

所以如果是K折,那么将构建K个模型,对吗?但为什么我在以下H2O的链接中读到它构建了K+1个模型?

https://github.com/h2oai/h2o-3/blob/master/h2o-docs/src/product/tutorials/gbm/gbmTuning.ipynb


回答:

可以说,“我在别处读到”这种说法太模糊了(在哪里?),因为上下文确实很重要。

最可能的情况是,这样的说法指的是一些库,这些库在完成CV的正式程序后,默认会继续使用CV找到的最佳性能的超参数在整个训练数据上构建一个模型;例如,请看R包caret的相关train函数,除了执行CV(如果请求),还会返回finalModel

finalModel

使用最佳参数拟合的对象

同样,scikit-learn的GridSearchCV也有一个相关的参数refit

refit : boolean, or string, default=True

使用在整个数据集上找到的最佳参数重新拟合一个估计器。

[…]

重新拟合的估计器可以在best_estimator_属性中获得,并且允许直接在这个GridSearchCV实例上使用predict

但即便如此,拟合的模型几乎从不只是K+1:当你实际使用CV进行超参数调整时(请记住,CV还有其他用途),你最终会拟合m*K个模型,其中m是你超参数组合集的长度(在单轮中,所有K折都使用一组超参数运行)。

换句话说,如果你的超参数搜索网格包含,例如,3个树的数量值和2个树深度值,你将在CV过程中拟合2*3*K = 6*K个模型,并且可能再加1,用找到的最佳超参数在整个数据上拟合你的模型。

因此,总结如下:

  • 根据定义,每个K折CV程序仅包括拟合K个模型,每个折一个模型,跨所有折使用固定的超参数

  • 在用于超参数搜索的CV情况下,此程序将为搜索网格中的每个超参数组合重复,导致m*K次拟合

  • 找到最佳超参数后,你可能想使用它们来拟合最终模型,即再多一次拟合

总共导致m*K + 1次模型拟合。

希望这对你有帮助…

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注