在管道中使用 gridsearchCV 时无法克隆对象错误
Cannot clone object error when using gridsearchCV in a pipeline
我正在制作一个由 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 但如果我不在这里声明它们得到另一个错误(估计器没有任何变量)
我确信我遗漏了一些基本的东西,但我找不到确切的东西,任何帮助将不胜感激!
如有遗漏重要信息,请追问!
您需要在 __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)
您需要保留父函数的拟合和转换函数的参数名称class
def fit(self, X, y):
self._model.fit(X)
return self
def transform(self, x):
return self._model.transform(x)
我正在制作一个由 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 但如果我不在这里声明它们得到另一个错误(估计器没有任何变量)
我确信我遗漏了一些基本的东西,但我找不到确切的东西,任何帮助将不胜感激!
如有遗漏重要信息,请追问!
您需要在 __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)
您需要保留父函数的拟合和转换函数的参数名称class
def fit(self, X, y):
self._model.fit(X)
return self
def transform(self, x):
return self._model.transform(x)