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

自定义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,导致克隆时无法还原原始参数,触发验证失败。

修复步骤

  1. 在__init__中单独保存原始的kernel参数(字符串类型),不直接修改
  2. 创建新的实例属性(如self._kernel_func)存储初始化后的kernel对象
  3. 确保所有__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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 20:18:09