You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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对象。所有拟合的模型副本在完成对应轮次的评估后就会被丢弃,原模型始终保持未拟合的初始状态。
  • 解决方式:
    1. 如果只是需要用全量数据训练模型做后续预测,在cross_validate执行完成后,手动调用model.fit(x, y),用完整的数据集拟合原模型实例。
    2. 如果需要保留交叉验证中表现最优的模型,可以改用GridSearchCV(它会自动保留最佳模型),或者手动实现交叉验证逻辑,在每轮结束后评估模型表现并保存最优的那个模型副本。

内容的提问来源于stack exchange,提问作者tail

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 00:23:15