使用 KNeighborsClassifier 的 SKlearn 管道

Posted

技术标签:

【中文标题】使用 KNeighborsClassifier 的 SKlearn 管道【英文标题】:SKlearn pipeline using KNeighborsClassifier 【发布时间】: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 的用例吗? 【参考方案1】:

scikit-learn Pipeline 步骤需要有transform() 方法。您可能想尝试使用 imblearn 中的管道。

例如在这里查看:https://bsolomon1124.github.io/oversamp/

【讨论】:

【参考方案2】:

错误清楚地表明 KNeighborsClassifier 没有变换方法 KNN 只有 fit 方法,而 SVM 有 fit_transform() 方法。对于管道,我们可以将 n 个参数传递给它。但所有参数都应该有转换器方法。请参考下面的链接

http://scikit-learn.org/stable/modules/generated/sklearn.pipeline.Pipeline.html

【讨论】:

以上是关于使用 KNeighborsClassifier 的 SKlearn 管道的主要内容,如果未能解决你的问题,请参考以下文章

使用 sklearn 使用 KNeighborsClassifier 时出错

KNeighborsClassifier .predict() 函数不起作用

当我将 IterativeImputer 与 KNeighborsClassifier 一起使用时出现错误“未知标签类型:'连续'”

KNeighborsClassifier' 对象没有属性 'append'

如何根据最高精度在sklearn的KNeighborsClassifier中选择K

使用make_blob,KNeighborsClassifier-K近邻算法进行分类