Python sklearn:fit_transform()不适用于GridSearchCV

Python sklearn:fit_transform()不适用于GridSearchCV,python,machine-learning,scikit-learn,grid-search,Python,Machine Learning,Scikit Learn,Grid Search,我正在创建一个GridSearchCV分类器 pipeline = Pipeline([ ('vect', TfidfVectorizer(stop_words='english',sublinear_tf=True)), ('clf', LogisticRegression()) ]) parameters= {} gridSearchClassifier = GridSearchCV(pipeline, parameters, n_jobs=3, verbose=

我正在创建一个
GridSearchCV
分类器

pipeline = Pipeline([
    ('vect', TfidfVectorizer(stop_words='english',sublinear_tf=True)),
    ('clf', LogisticRegression())
    ])

parameters= {}

gridSearchClassifier = GridSearchCV(pipeline, parameters, n_jobs=3, verbose=1, scoring='accuracy')
    # Fit/train the gridSearchClassifier on Training Set
    gridSearchClassifier.fit(Xtrain, ytrain)
这很有效,我可以预测。但是,现在我想重新训练分类器。为此,我想对一些反馈数据进行
fit\u transform()

    gridSearchClassifier.fit_transform(Xnew, yNew)
但是我得到了这个错误

AttributeError: 'GridSearchCV' object has no attribute 'fit_transform'

基本上,我尝试在分类器的内部
TFIDFvectorier
fit_transform()
。我知道我可以使用
named_steps
属性访问
管道的内部组件。我可以为
gridSearchClassifier
做类似的事情吗?

只需逐步调用它们

gridSearchClassifier.fit(Xnew, yNew)
transformed = gridSearchClassifier.transform(Xnew)
fit_变换
不过是这两行代码,只是没有作为
GridSearchCV
的单一方法实现

更新 从评论来看,您似乎对GridSearchCV的实际功能有些茫然。这是一种元方法,用于拟合具有多个超参数的模型。因此,一旦调用
fit
,对象的
best\u estimator\u
字段中就会有一个估计器。在您的例子中,它是一个管道,您可以像往常一样提取它的任何部分,因此

gridSearchClassifier.fit(Xtrain, ytrain)
clf = gridSearchClassifier.best_estimator_
# do something with clf, its elements etc. 
# for example print clf.named_steps['vect']

您应该而不是使用gridsearchcv作为分类器,这只是拟合超参数的一种方法,一旦找到超参数,您应该使用
最佳估计器。但是,请记住如果重新安装TFIDF矢量器,那么您的分类器将毫无用处;您无法更改数据表示并期望旧模型正常工作,一旦数据更改,您必须重新安装整个分类器(除非这是精心设计的更改,并且您确保旧维度的含义完全相同-sklearn不支持此类操作,您必须从头开始实现).

@lejot正确的做法是在
gridSearchClassifier
上调用
fit()

如果
GridSearchCV
上设置了
refit=True
,这是默认设置,您可以在安装的
gridSearchClassifier
上访问
最佳估计值

您可以访问已安装的步骤:

tfidf = gridSearchClassifier.best_estimator_.named_steps['vect']
clf = gridSearchClassifier.best_estimator_.named_steps['clf']
然后,您可以使用以下方法在
new_X
中转换新文本:

X_vec = tfidf.transform(new_X)
您可以使用此
X_-vec
对以下各项进行预测:

x_pred = clf.predict(X_vec)
您还可以使用整个管道对通过管道的文本进行预测

X_pred = gridSearchClassifier.predict(new_X)

这将重新装配整个模型。与“fit_transform”完全一样,我使用了gridSearchClassifier.fit(Xtrain,ytrain)gridSearchClassifier=gridSearchClassifier.transform(Xtrain),当我尝试使用gridSearchClassifier.best_score时,我得到了错误属性error:best_score_u找不到类似命名步骤的方法来访问内部TFIDfVectorier吗?谢谢,现在它更有意义了。我想如果我单独使用TFIDFvectorier会更好。您需要一个具有在线学习功能的分类器(如sklearn的SGDClassizer),或者“冻结”tfidf,或者“手动”修改,因此以前的维度与以前相同,您只需添加新维度,手动输入最后一个分类器作为新分类器的起点,新维度设置为0。一般来说,增量学习在生产中并不简单。你的意思是像gridSearchClassifier.fit(Xnew,yNew)gridSearchClassifier.best_estimator_uu.named_steps['vect'].transform(Xnew)我还想使用gridSearchClassifier来获得gridSearchClassifier.best_score_基本上在拟合和转换完成后,我想用分类器准确地预测和做其他事情。如果通过
GridSearch(clf,params,refit=True)
传递
refit=True
,您可以在任何转换步骤上调用transform,也可以在最后的估计器步骤上调用predict。@AbtPst,我更新了我的答案,提供了更多关于如何使用拟合的GridSearch分类器的示例。