K-Fold是否迭代训练模型

Does K-Fold iteratively train a model

如果您在数据集上 运行 cross-val_score() 或 cross_validate(),估计器是否使用 运行 末尾的所有折叠进行训练?

我在某处读到 cross-val_score 复制了一份估算器。而我认为这就是使用 k-fold 训练模型的方式。

或者,在 cross_validate() 或 cross_val_score() 的末尾,您有一个估计器,然后将其用于 predict()

我的想法正确吗?

这里可以参考sklearn-document

如果你做 3 折交叉验证,

  • sklearn 会将您的数据集拆分为 3 个部分。 (例如,第 1 部分包含第 1-3 行,第 2 部分包含第 4-6 行,依此类推)
  • sklearn 使用不同的训练集和验证集迭代训练新模型 3 次
    • 在第一轮中,它将第 1 部分和第 2 部分结合在一起作为训练集,并用第 3 部分测试模型。
    • 在第二轮中,它将第 1 部分和第 3 部分结合在一起作为训练集,并用第 2 部分测试模型。
    • 等等。

因此,使用cross-validate后,您将获得三个模型。如果你想要每一轮的模型对象,你可以添加参数return_estimato=True。作为字典的结果将有另一个名为 estimator 的键,其中包含每个训练的估计器列表。

from sklearn import datasets, linear_model
from sklearn.model_selection import cross_validate
from sklearn.metrics import make_scorer
from sklearn.metrics import confusion_matrix
from sklearn.svm import LinearSVC
diabetes = datasets.load_diabetes()
X = diabetes.data[:150]
y = diabetes.target[:150]
lasso = linear_model.Lasso()
cv_results = cross_validate(lasso, X, y, cv=3, return_estimator=True)
print(sorted(cv_results.keys()))
#Output: ['estimator', 'fit_time', 'score_time', 'test_score']
cv_results['estimator']
#Output: [Lasso(), Lasso(), Lasso()]

然而,在实践中,交叉验证方法仅用于测试模型。在你找到好的模型和参数设置后,给你 cross-validation 高分。如果再用整个训练集拟合模型,再用测试集测试模型,效果会更好。