问题描述
我正在制作一个由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)