【问题标题】:Problem with SelectKBest method in pipeline管道中 SelectKBest 方法的问题
【发布时间】:2019-08-15 13:12:44
【问题描述】:

我正在尝试解决使用 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)

【问题讨论】:

    标签: python scikit-learn pipeline


    【解决方案1】:

    所以,我认为管道的顺序并不重要,但后来我发现管道的最后一个成员必须能够适应/转换。我通过使 clf 成为最后一个来更改管道的顺序。问题解决了。

    【讨论】:

    • 实际上,管道的最后一项必须是估计器(即回归器/分类器);它是 intermediate 项必须实现 fit & transform。
    【解决方案2】:

    steps 中确定的管道中的操作顺序很重要;来自docs

    步骤:列表

    链接的(名称,变换)元组(实现拟合/变换)列表,按链接顺序排列,最后一个对象是估计器。

    错误是由于将SelectKBest 添加为管道的 last 元素:

    step = [('scaler', s), ('kn', clf), ('sel',sel)]
    

    这不是一个估计器(它是一个变压器),以及你的中间步骤kn不是一个变压器。

    我猜你真的不想在拟合模型之后执行特征选择...

    改成:

    step = [('scaler', s), ('sel', sel), ('kn', clf)]
    

    你应该没事的。

    【讨论】:

      猜你喜欢
      • 2020-10-02
      • 2016-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多