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

使用cross_val_score后调用pipeline.predict触发NotFittedError的解决方法

问题描述

以下是我的代码:

from sklearn.pipeline import Pipeline
from sklearn.model_selection import cross_val_score
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris

pipeline = Pipeline([
    ('scaler', StandardScaler()), 
    ('classifier', LogisticRegression())  
])

X_train, y_train = load_iris(return_X_y=True)  
cv_scores = cross_val_score(pipeline, X_train, y_train, cv=5)

X_test, y_test = load_iris(return_X_y=True) 
test_predictions = pipeline.predict(X_test) 

运行后出现如下错误:

NotFittedError: This StandardScaler instance is not fitted yet. Call 'fit' with appropriate arguments before using this estimator.

我原本以为使用cross_val_score时会自动调用fit方法训练估计器,请问这种情况该如何解决?我考虑过先调用pipeline.fit()再执行cross_val_score,但觉得这是冗余操作,我的想法是否有误?

问题原因与解决方法

核心原因

cross_val_score确实会在交叉验证的每个折里临时拟合传入的Pipeline,但它只会操作Pipeline的副本,不会修改你定义的原始Pipeline对象。跑完交叉验证后,原始Pipeline依然处于未拟合状态,直接调用predict自然会报错。

正确解决方式

方式一:先评估性能,再拟合模型做预测

交叉验证的作用是评估模型的泛化性能,而要得到可用于预测的模型,必须手动调用fit方法用全量训练数据拟合。这两个步骤目的不同,不算冗余:

from sklearn.pipeline import Pipeline
from sklearn.model_selection import cross_val_score, train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris

pipeline = Pipeline([
    ('scaler', StandardScaler()), 
    ('classifier', LogisticRegression())  
])

# 拆分真实的训练集和测试集(避免用全量数据当测试集,导致结果偏乐观)
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 用训练集做交叉验证评估性能
cv_scores = cross_val_score(pipeline, X_train, y_train, cv=5)

# 用全量训练集拟合Pipeline
pipeline.fit(X_train, y_train)

# 对测试集做预测
test_predictions = pipeline.predict(X_test)

方式二:使用cross_validate获取更多验证信息

如果需要同时得到交叉验证的分数和模型拟合状态,可以用cross_validate,但它同样不会修改原始Pipeline,若要预测仍需手动拟合。

关于“冗余操作”的疑问

你的顾虑有道理,但交叉验证和模型拟合是两个独立环节:

  • 交叉验证是为了验证模型在不同数据划分下的稳定性,不产出可用的预测模型;
  • 调用fit是为了得到基于全量训练数据的模型,用于后续预测。
    两者目的不同,不存在冗余。如果只需要评估性能,不需要做预测,确实不需要调用fit;但要做预测,就必须完成拟合步骤。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 04:35:22