在管道中使用gridsearchCV时无法克隆对象错误

问题描述

我正在制作一个由tfidf矢量化器和xgboost分类器组成的管道,并且试图为我的问题找到矢量化器的最佳参数。但是,我收到以下错误:

Cannot clone object Text2TfIdfTransformer(max_df=0.5,max_features=1000),as the constructor either does not set or modifies parameter max_df.

代码如下:

class Text2TfIdfTransformer(BaseEstimator):

    def __init__(self,max_df = 1,max_features = 3000):
        self._model = TfidfVectorizer(max_df,max_features,sublinear_tf=True)
        pass

    def fit(self,data,df_y=None):
        self._model.fit(data)
        return self

    def transform(self,text):
        return self._model.transform(text)
    


pl_xgb_tf_idf = Pipeline(steps=[('tfidf',Text2TfIdfTransformer()),('xgboost',XGBClassifier(objective='multi:softmax'))])


parameters = {'tfidf__max_df':[.5,.6],'tfidf__max_features': [1000]}
grid = GridSearchCV(pl_xgb_tf_idf,param_grid=parameters,cv=5)
grid.fit(X,labels)

我不确定在调用 init 时是否应声明变量max_df和max_features,但是如果我在此处未声明变量,我会收到另一个错误(估算器没有任何变量)

我确定我缺少基本的知识,但是我找不到确切的东西,任何帮助将不胜感激!

如果缺少一些重要信息,请询问!

解决方法

您需要保留父类的fit和transform函数的参数名称

    def fit(self,X,y):
        self._model.fit(X)
        return self

    def transform(self,x):
        return self._model.transform(x)
,

您需要在__init __中声明参数,以便对它们进行网格搜索,否则会破坏sklearn API约定。

这应该可以解决您的问题:

def __init__(self,max_df = 1,max_features = 3000):
    self.max_df = max_df
    self.max_features = max_features
    self._model = TfidfVectorizer(self.max_df,self.max_features,sublinear_tf=True)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...