为何KFold交叉验证及cross_val_score后仍需调用.fit方法?
.fit()方法? 这是个非常好的问题!很多刚接触scikit-learn交叉验证的同学都会有这个困惑,我来给你拆解清楚核心原因:
cross_val_score训练的是临时模型副本,不会修改你传入的原始模型
当你调用cross_val_score(model, train_s1, target_s1, cv=5, scoring='neg_mean_absolute_error')时,scikit-learn会在内部做这些操作:- 把你的原始
model对象复制5份(对应cv=5的设置) - 每次取一份副本,用对应的训练子集训练它
- 用验证子集计算分数,把分数收集起来
- 所有fold完成后,返回分数数组,但那些训练好的临时模型副本会被丢弃,你传入的原始
model还是初始的未训练状态
- 把你的原始
.fit()是为了得到可用于预测的最终模型
交叉验证的核心作用是评估模型的泛化能力,帮你判断模型在未见过的数据上的表现,而不是直接生成可以用来做预测的模型。如果你要对新数据(比如测试集)做预测,需要一个在完整训练数据集上训练好的模型——这正是.fit(train_s1, target_s1)的作用:它会用全部训练数据训练你手中的原始模型,让它具备预测能力。举个直观的例子:
假设你初始化了一个model = LinearRegression(),直接调用model.predict(test_data)肯定会报错,因为模型还没被训练。哪怕你刚跑过cross_val_score,这个model依然是初始状态,所以必须先调用.fit()完成训练,才能使用.predict()。
如果你的需求是在交叉验证过程中保留每个fold的训练模型,可以考虑使用cross_validate(设置return_estimator=True),或者手动编写交叉验证循环来保存每个训练好的模型副本,但这和“得到最终预测模型”的需求是两回事。
内容的提问来源于stack exchange,提问作者Sachin Kamble

