我正在尝试解决使用KNN算法进行分类的问题。使用管道时,我决定添加SelectKBest
,但出现以下错误:
所有中间步骤都应该是变形器,并实现拟合和变换。
我不知道我是否可以在KNN中使用此选择算法。但是我也尝试使用SVM并获得了相同的结果。这是我的代码:
sel = SelectKBest('chi2',k = 3)
clf = kn()
s = ss()
step = [('scaler', s), ('kn', clf), ('sel',sel)]
pipeline = Pipeline(step)
parameter = {'kn__n_neighbors':range(1,40,1), 'kn__weights':['uniform','distance'], 'kn__p':[1,2] }
kfold = StratifiedKFold(n_splits=5, random_state=0)
grid = GridSearchCV(pipeline, param_grid = parameter, cv=kfold, scoring = 'accuracy', n_jobs = -1)
grid.fit(x_train, y_train)
答案 0 :(得分:1)
steps
中确定的管道中的操作顺序很重要;来自docs:
步骤:列表
(名称,变换)元组(实现拟合/变换)的链表,它们按链的顺序排列,最后一个对象为估计量。
该错误是由于在管道的 last 元素中添加了SelectKBest
:
step = [('scaler', s), ('kn', clf), ('sel',sel)]
这不是一个估计值(它是一个变压器),以及您的中间步骤kn
不是一个变压器。
我猜您真的不希望在安装了模型后 执行功能选择...
将其更改为:
step = [('scaler', s), ('sel', sel), ('kn', clf)]
,你应该没事。
答案 1 :(得分:0)
因此,我认为管道的顺序并不重要,但是后来,我发现管道的最后一个成员必须能够装配/变形。我通过使clf为最后一个更改了管道的顺序。问题解决了。