我已经阅读了K折交叉验证的一般步骤,网址是https://machinelearningmastery.com/k-fold-cross-validation/
它描述了一般程序如下:
- 随机打乱数据集。
- 将数据集分成k组(折)
- 对于每个独特的组:将该组作为保留或测试数据集
- 将剩余的组作为训练数据集,在训练集上拟合模型并在测试集上评估它
- 保留评估分数并丢弃模型
- 使用模型评估分数的样本总结模型的技能
所以如果是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
次模型拟合。
希望这对你有帮助…