K-Fold是否迭代地训练一个模型



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

我在某处读到cross-val_score取一个估计器的副本。而我认为这是你使用k-fold训练模型的方法。

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

我的想法正确吗?

您可以在这里参考sklearn-document。

如果你做3-Fold交叉验证,

  • sklearn将你的数据集分成3部分。(例如,第一部分包含第1 -3行,第二部分包含第4 -6行,依此类推)
  • sklearn迭代使用不同的训练集和验证集训练新模型3次
    • 在第一轮中,将第一部分和第二部分合并作为训练集,并与第三部分对模型进行测试。
    • 第二轮,将第一部分和第三部分合并作为训练集,用第二部分测试模型。
    • 等等

因此,在使用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()]

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