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分类器的示例。