使用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
相关产品推荐
相关产品推荐

