使用 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'