Scikit learn sklearn GridSearchCV、SelectKBest和SVM

Scikit learn sklearn GridSearchCV、SelectKBest和SVM,scikit-learn,svm,Scikit Learn,Svm,我正在尝试通过我编写的函数golub制作一个使用特征选择的分类器,golub根据SelectKBest的要求返回两个np数组。我想把它和一个支持向量机分类器联系起来,这个分类器使用线性和,并对k和C的可能组合进行优化。然而,我迄今为止所做的尝试没有成功,我不知道为什么。代码如下: import numpy as np from sklearn import cross_validation from sklearn import svm from sklearn.feature_sele

我正在尝试通过我编写的函数golub制作一个使用特征选择的分类器,golub根据SelectKBest的要求返回两个np数组。我想把它和一个支持向量机分类器联系起来,这个分类器使用线性和,并对k和C的可能组合进行优化。然而,我迄今为止所做的尝试没有成功,我不知道为什么。代码如下:

 import numpy as np
 from sklearn import cross_validation
 from sklearn import svm
 from sklearn.feature_selection import SelectKBest
 from sklearn.pipeline import make_pipeline, Pipeline
 from sklearn.grid_search import GridSearchCV
 from golub_mod import golub

 class SVM_golub_linear:
    def __init__(self,X,y):
       self.X=X
       self.y=y


   def Golub_SVM(self):
       X=self.X
       y=self.y
       kbest=SelectKBest(golub,k=1)
       k_vals=np.linspace(100,1000,10,dtype=int)
       k_vals=k_vals.tolist()
       c_vals=[0.00001,0.0001,0.001,0.01,.1,1,10,100,1000]

       clf=svm.LinearSVC(penalty='l2')
       steps=[('feature_selection',kbest),('svm_linear',clf)]
       pipeline=make_pipeline(steps)
       params=dict(feature_selection__k=k_vals,
       svm_linear__C=c_vals)
       best_model=GridSearchCV(pipeline,param_grid=params)
       self.model=best_model.fit(X,y)
       print(best_mod.best_params_)

   def svmpredict(self,X_n):
       y_vals=self.model.predict(X_n)
       return y_vals
当我尝试运行此命令时:

   model=SVM_golub_linear(X,y)
   model.Golub_SVM()
我得到以下错误:

 TypeError: Last step of chain should implement fit    '[('feature_selection',
  SelectKBest(k=1, score_func=<function golub at 0x105f2c398>)), ('svm_linear', LinearSVC(C=1.0, class_weight=None, dual=False, fit_intercept=True,
 intercept_scaling=1, loss='squared_hinge', max_iter=1000,
 multi_class='ovr', penalty='l2', random_state=None, tol=0.0001,
 verbose=0))]' (type <type 'list'>) doesn't)
TypeError:链的最后一步应该实现fit'[('feature\u selection',
选择kBest(k=1,score\u func=),('svm\u linear',LinearSVC(C=1.0,class\u weight=None,dual=False,fit\u intercept=True,
截距=1,损耗=平方铰链,最大iter=1000,
多类=ovr,惩罚=l2,随机状态=无,tol=0.0001,
verbose=0))]'(类型)不存在)

我不理解这一点,因为LinearSVC确实有一个合适的方法。如果您更换了,请在上面的代码中添加

    pipeline=make_pipeline(steps)

代码按原样工作

    pipeline=Pipeline(steps)