如何在sklearn中将交叉验证与自定义估算器结合使用?

时间:2019-01-17 09:49:32

标签: python machine-learning scikit-learn

我用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)

有人有解决此问题的想法吗?

2 个答案:

答案 0 :(得分:0)

我建议将预处理器放在管道内部。 public function attachAnyChoice() { return false; } 会尝试复制估算器的参数,当估算器在调用Cross_val_score时无法返回参数时,它将中断。

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

答案 1 :(得分:0)

正如一些评论所建议的,此错误是因为 import { RouterModule } from '@angular/router'; @NgModule({ ... imports: [ ... RouterModule.forRoot(appRoutes) ], ... }) export class AppModule{} 无法被深克隆。

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