【发布时间】:2017-08-01 16:13:23
【问题描述】:
我正在尝试在 sklearn 中构建一个 GridSearchCV 管道以使用 KNeighborsClassifier 和 SVM。到目前为止,已经尝试了以下代码:
from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import Pipeline
from sklearn.neighbors import KNeighborsClassifier
neigh = KNeighborsClassifier(n_neighbors=3)
from sklearn import svm
from sklearn.svm import SVC
clf = SVC(kernel='linear')
pipeline = Pipeline([ ('knn',neigh), ('sVM', clf)]) # Code breaks here
weight_options = ['uniform','distance']
param_knn = {'weights':weight_options}
param_svc = {'kernel':('linear', 'rbf'), 'C':[1,5,10]}
grid = GridSearchCV(pipeline, param_knn, param_svc, cv=5, scoring='accuracy')
但出现以下错误:
TypeError: All intermediate steps should be transformers and implement fit and transform. 'KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
metric_params=None, n_jobs=1, n_neighbors=3, p=2,
weights='uniform')' (type <class 'sklearn.neighbors.classification.KNeighborsClassifier'>) doesn't
谁能帮我解决我哪里出了问题,以及如何纠正它?我认为最后一行也有问题,重新参数。
【问题讨论】:
-
我认为你不能将两个分类器传递给
Pipeline。来自 scikit-learn 文档:“管道的中间步骤必须是‘转换’,也就是说,它们必须实现拟合和转换方法。最终的估计器只需要实现拟合。管道的目的是组装几个步骤可以在设置不同参数时一起交叉验证。” -
谢谢,但我还是没明白。将检查一些工作示例以更多地理解这个概念。无论如何感谢您的帮助。
-
@h_s 想说的是,pipeline 中的所有步骤(不包括最后一个)都必须有一个转换方法,即它们应该以某种方式修改数据,而不是作为分类器学习数据。
knn是一个分类器。它学习数据以便以后能够预测,但没有transform方法。你能告诉你在同一管道中使用 Knn 和 Svc 的用例吗?
标签: python scikit-learn pipeline grid-search