Python scikit-learn:无法克隆对象...因为构造函数似乎没有设置参数

Posted

技术标签:

【中文标题】Python scikit-learn:无法克隆对象...因为构造函数似乎没有设置参数【英文标题】:Python scikit-learn: Cannot clone object... as the constructor does not seem to set parameter 【发布时间】:2014-08-22 00:40:09 【问题描述】:

我修改了 scikit-learn 的 BernoulliRBM 类以使用 softmax 可见单元组。在这个过程中,我添加了一个额外的 Numpy 数组 visible_config 作为类属性,它在构造函数中初始化如下:

self.visible_config = np.cumsum(np.concatenate((np.asarray([0]),
                                visible_config), axis=0))

visible_config 是一个 Numpy 数组,作为输入传递给构造函数。当我直接使用fit() 函数训练模型时,代码运行没有错误。但是,当我使用GridSearchCV 结构时,出现以下错误

Cannot clone object SoftmaxRBM(batch_size=100, learning_rate=0.01, n_components=100, n_iter=100,
  random_state=0, verbose=True, visible_config=[ 0 21 42 63]), as the constructor does not seem to set parameter visible_config

这似乎是类实例与其由sklearn.base.clone 创建的副本之间的相等性检查问题,因为visible_config 未正确复制。我不知道如何解决这个问题。它在文档中说sklearn.base.clone 使用deepcopy(),所以visible_config 不应该也被复制吗?有人可以解释一下我可以在这里尝试什么吗?谢谢!

【问题讨论】:

【参考方案1】:

没有看到您的代码,很难准确判断出了什么问题,但您在这里违反了 scikit-learn API 约定。估计器中的构造函数应该将属性设置为用户作为参数传递的值。所有计算都应该在fit 中进行,如果fit 需要存储计算结果,它应该在带有下划线(_) 的属性中进行。这个约定使clone 和诸如GridSearchCV 之类的元估计器起作用。

(*) 如果您在主代码库中看到违反此规则的估算器:那将是一个错误,欢迎使用补丁。

【讨论】:

你是对的。谢谢!删除计算步骤并将预先计算的visible config 传递给构造函数解决了问题。 其他人尝试这个...确保你没有在 init 中克隆你的模型。例如class NewAlgo(baseestimator, otherestimator): def __init__(sefl,model): self.model = clone(model) 不要那样做 我在使用 xgboost 和 RandomizedSearchCV 时遇到了这个问题,其中我的网格中有一个错字/不推荐使用的参数

以上是关于Python scikit-learn:无法克隆对象...因为构造函数似乎没有设置参数的主要内容,如果未能解决你的问题,请参考以下文章

如何克隆包括其数据的 scikit-learn 估计器?

无法在 Python 中安装 scikit-learn

Python / Scikit-Learn - 无法处理多类和连续的混合

无法导入 Scikit-Learn

在 python 中使用 BernoulliNB(朴素贝叶斯分类器)scikit-learn 的简单示例 - 无法解释分类

无法安装 scikit-learn,但它无法在窗口 8.1 的 jupyter notebook 中的 python 3.10 中安装 [重复]