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

使用cross_val_score设置scoring为neg_mean_squared_error触发TypeError

回归模型cross_val_score设置scoring='neg_mean_squared_error'触发TypeError问题解决

问题场景

在汽车价格预测的回归任务中,使用cross_val_score评估模型时,设置scoring='neg_mean_squared_error'触发如下错误:

TypeError                                 Traceback (most recent call last)
Cell In [46], line 1
----> 1 cross_val_score(model, transformed_X, y, cv=5, scoring='neg_mean_squared_error')

TypeError: 'numpy.float64' object is not callable

注:不设置scoring参数时,np.mean(cross_val_score(model, transformed_X, y, cv=5))可正常运行。

问题代码片段

报错核心代码:

cross_val_score(model, transformed_X, y, cv=5, scoring='neg_mean_squared_error')

完整代码:

from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer

OneHotEncoder = OneHotEncoder()
categorical_features = ["Make", "Colour", "Doors"]
transformer = ColumnTransformer([("one-hot",
                                   OneHotEncoder,
                                   categorical_features)],
                                   remainder="passthrough")

transformed_X = transformer.fit_transform(X)
transformed_X

from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split

np.random.seed(0)

X = car_sales.drop("Price", axis=1)
y = car_sales["Price"]

X_train, X_test, y_train, y_test = train_test_split(transformed_X,
                                                    y,
                                                    test_size=0.2)

model = RandomForestRegressor()
model.fit(X_train, y_train)
model.score(X_test, y_test)

cross_val_score(model, transformed_X, y, cv=5, scoring='neg_mean_squared_error')

transformed_X示例:

array([[0.0000000e+00, 1.0000000e+00, 0.0000000e+00, ..., 3.5431000e+04,
        4.3200000e+02, 2.2015860e+04],
       [1.0000000e+00, 0.0000000e+00, 0.0000000e+00, ..., 1.9271400e+05,
        1.0300000e+02, 1.1974723e+05],
       [0.0000000e+00, 1.0000000e+00, 0.0000000e+00, ..., 8.4714000e+04,
        3.3400000e+02, 5.2638970e+04],
       ...,
       [0.0000000e+00, 0.0000000e+00, 1.0000000e+00, ..., 6.6604000e+04,
        4.7300000e+02, 4.1385910e+04],
       [0.0000000e+00, 1.0000000e+00, 0.0000000e+00, ..., 2.1588300e+05,
        1.8000000e+01, 1.3414381e+05],
       [0.0000000e+00, 0.0000000e+00, 0.0000000e+00, ..., 2.4836000e+05,
        5.1000000e+01, 1.5432413e+05]])

问题原因

代码存在命名冲突:

  • 先导入from sklearn.preprocessing import OneHotEncoder(类对象),随后执行OneHotEncoder = OneHotEncoder(),将原类对象覆盖为类的实例对象。
  • 后续ColumnTransformer中使用的OneHotEncoder是实例而非类,导致数据转换流程出现隐藏异常,最终在cross_val_score调用评分指标时触发类型错误。

解决方案

修改实例变量名,避免覆盖原类:

from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split, cross_val_score
import numpy as np

# 重命名实例变量,避免覆盖原OneHotEncoder类
one_hot_encoder = OneHotEncoder()
categorical_features = ["Make", "Colour", "Doors"]
transformer = ColumnTransformer([("one-hot",
                                   one_hot_encoder,
                                   categorical_features)],
                                   remainder="passthrough")

np.random.seed(0)

X = car_sales.drop("Price", axis=1)
y = car_sales["Price"]

# 先拆分数据集再做特征转换,避免数据泄露(原代码顺序有误)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
transformed_X_train = transformer.fit_transform(X_train)
transformed_X_test = transformer.transform(X_test)

model = RandomForestRegressor()
model.fit(transformed_X_train, y_train)
model.score(transformed_X_test, y_test)

# 现在可正常执行
cross_val_score(model, transformer.fit_transform(X), y, cv=5, scoring='neg_mean_squared_error')

额外优化:

  • 调整数据处理顺序,先拆分数据集再做特征转换,避免数据泄露。
  • 显式导入所有需要的库,保证代码独立性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 19:55:30