【问题标题】:How to use cross-validation with custom estimator in sklearn?如何在 sklearn 中使用带有自定义估计器的交叉验证?
【发布时间】:2019-06-11 11:42:30
【问题描述】:

我用fittransform 方法编写了一个自定义估算器类。我能够创建模型,使用该模型进行训练和预测。

但是,在进行交叉验证时,我遇到了这个错误:TypeError: cannot deepcopy this pattern object

这就是CustomEstimator 的样子:

class DefaultEstimator(BaseEstimator, TransformerMixin):
    def __init__(self, preprocessor, pipelines):
      self.preprocessor = preprocessor
      self.pipelines = pipelines

    def fit(self, X, y=None):
      for each_pipeline in self.pipelines:
          each_pipeline.fit(self.preprocessor.apply(X), y)
      return self

   def transform(self, X):
     transformed_data = []
     for each_pipeline in self.pipelines:
        transformed_data.append(each_pipeline.transform(self.preprocessor.apply(X)))
     return sp.hstack(transformed_data)

有人对解决这个问题有想法吗?

【问题讨论】:

  • 你能分享代码吗?从BaseEstimator 继承可以完美运行(参见github.com/luispedro/BuildingMachineLearningSystemsWithPython/… 示例)。
  • @MatthieuBrucher:添加了CustomEstimator的代码
  • 可能管道和预处理器不能深拷贝?你能检查一下吗?
  • @MatthieuBrucher 是的,这就是问题所在。预处理器不能是深拷贝。

标签: python machine-learning scikit-learn


【解决方案1】:

我建议将预处理器放在管道本身内部。 Cross_val_score 会尝试复制估算器的参数,当估算器在调用 get_params() 时无法返回参数时,它会中断。

我不确定您的管道参数是否是 Sklearn 管道,因为管道对象不可迭代。

【讨论】:

  • 真的,我查过了。这是我遇到的问题,使用预处理器。但是,我正在构建基于布尔配置文件的预处理器。因此,每次在训练期间,都会创建一个用于预处理的预处理器类对象。另一方面,pipeline 参数是一个 Sklearn 管道,无需添加预处理器即可完美运行。
【解决方案2】:

正如一些 cmets 所建议的,这个错误是因为 self.processor 不能被深度克隆。

因此,此错误的解决方法是从此类中删除预处理步骤,并将其作为独立的预处理步骤或管道本身移动。

【讨论】:

  • 您知道在强制转换数据时如何解决此错误吗?就我而言,我需要使用LabelBinarizer 进行分类/预测
猜你喜欢
  • 2020-09-13
  • 2013-12-18
  • 2014-07-27
  • 2019-10-22
  • 2015-01-21
  • 2015-06-06
  • 2019-06-01
  • 2018-09-23
相关资源
最近更新 更多