自定义Sklearn核回归器使用cross_val_score时遇克隆错误求解决
自定义Sklearn核回归器交叉验证报错解决方案
问题描述
实现了兼容Sklearn的自定义核回归器MyKerReg,单独调用predict方法运行正常,但使用cross_val_score进行交叉验证时抛出以下错误:
Exception has occurred: RuntimeError Cannot clone object MyKerReg(bandwidth=0.5, kernel=<models.kernel.kernel object at 0x7fab359bc940>), as the constructor either does not set or modifies parameter kernel
报错原因
Sklearn的交叉验证(如cross_val_score)会通过克隆estimator对象避免数据泄露,克隆逻辑要求:
- 类的
__init__方法必须直接保存原始输入参数到实例属性,不能修改参数的类型或值 - 实例属性名称必须与
__init__的参数名完全一致
原代码中,__init__直接将传入的字符串类型kernel参数转换为ker.kernel对象并赋值给self.kernel,导致克隆时无法还原原始参数,触发验证失败。
修复步骤
- 在
__init__中单独保存原始的kernel参数(字符串类型),不直接修改 - 创建新的实例属性(如
self._kernel_func)存储初始化后的kernel对象 - 确保所有
__init__参数都直接对应实例属性,类型与输入一致
完整修复代码
import numpy as np from sklearn.base import BaseEstimator, RegressorMixin from sklearn.utils.validation import check_X_y, check_array, check_is_fitted import models.kernel as ker class MyKerReg(BaseEstimator, RegressorMixin): def __init__(self, kernel="gaussian", bandwidth=1.0): # 直接保存原始参数,不修改类型 self.kernel = kernel self.bandwidth = bandwidth # 初始化kernel函数对象到单独的属性 self._kernel_func = ker.kernel(kernel) def fit(self, X, y): X, y = check_X_y(X, y, accept_sparse=True, ensure_2d=False) self.is_fitted_ = True self.X_ = X self.y_ = y return self def predict(self, X): X = check_array(X, accept_sparse=True, ensure_2d=False) check_is_fitted(self, 'is_fitted_') pred = [] for x in X: tmp = [x - v for v in self.X_] # 使用_kernel_func替代原来的self.kernel ker_values = [(1/self.bandwidth)*self._kernel_func(v/self.bandwidth) for v in tmp] ker_values = np.array(ker_values) values = np.array(self.y_) num = np.dot(ker_values.T, values) denom = np.sum(ker_values) pred.append(num/denom) return pred
验证方法
使用原交叉验证代码测试:
y, x = misc.data_generating_process(1000) x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=44) kr = MyKerReg(kernel="gaussian", bandwidth=0.5) print(cross_val_score(kr, x_train, y_train, scoring="neg_mean_squared_error", cv=5))
此时cross_val_score可正常执行,不会再抛出克隆错误。
内容的提问来源于stack exchange,提问作者Dragos Tanasa
相关产品推荐
相关产品推荐

