调用cross_validate后触发NotFittedError,模型为何未完成拟合?
问题描述
我实例化了Gaussian朴素贝叶斯分类器,想用sklearn.model_selection.cross_validate做交叉验证(因为实际项目需要精确率、召回率和F1等多指标,所以选它而非cross_val_score)。原本以为执行cross_validate后,模型会在全量特征和标签数据上完成拟合,但调用model.predict()时却报错。
最小可复现代码
import numpy as np from sklearn.naive_bayes import GaussianNB from sklearn.model_selection import cross_validate x = np.array([ [1, 2], [3, 4], [5, 6], [6, 7] ]) y = [1, 0, 0, 1] model = GaussianNB() scores = cross_validate(model, x, y, cv=2, scoring=("accuracy")) model.predict([8,9])
报错内容
sklearn.exceptions.NotFittedError: This GaussianNB instance is not fitted yet. Call 'fit' with appropriate arguments before using this estimator.
我的疑问:cross_validate明明会执行cv=2次拟合,为什么原模型实例还是未拟合状态?
解答
- 根本原因:
cross_validate执行交叉验证时,会为每一轮CV创建传入模型的独立副本,用这些副本分别拟合对应的训练子集、评估验证子集,整个过程完全不会修改你最初定义的model对象。所有拟合的模型副本在完成对应轮次的评估后就会被丢弃,原模型始终保持未拟合的初始状态。 - 解决方式:
- 如果只是需要用全量数据训练模型做后续预测,在
cross_validate执行完成后,手动调用model.fit(x, y),用完整的数据集拟合原模型实例。 - 如果需要保留交叉验证中表现最优的模型,可以改用
GridSearchCV(它会自动保留最佳模型),或者手动实现交叉验证逻辑,在每轮结束后评估模型表现并保存最优的那个模型副本。
- 如果只是需要用全量数据训练模型做后续预测,在
内容的提问来源于stack exchange,提问作者tail
相关产品推荐
相关产品推荐

