Scikit learn scikit学习中自定义核SVM的交叉验证

Scikit learn scikit学习中自定义核SVM的交叉验证,scikit-learn,svm,cross-validation,Scikit Learn,Svm,Cross Validation,我想使用scikit learn通过交叉验证对自定义内核SVM进行网格搜索。更准确地说 我想定义一个内核函数,比如 def my_kernel(x, y): """ We create a custom kernel: k(x, y) = x * M *y.T """ return np.dot(np.dot(x, M), y.T) 其中M是核的参数(如高斯核中的gamma) 我想输入这个参数M,比如 parameters = {'kernel':('my_kernel')

我想使用scikit learn通过交叉验证对自定义内核SVM进行网格搜索。更准确地说 我想定义一个内核函数,比如

def my_kernel(x, y):
"""
We create a custom kernel:
k(x, y) = x * M *y.T          
"""
return np.dot(np.dot(x, M), y.T)
其中M是核的参数(如高斯核中的gamma)

我想输入这个参数M,比如

parameters = {'kernel':('my_kernel'), 'C':[1, 10], 'M':[M1,M2]}
svr = svm.SVC()
clf = grid_search.GridSearchCV(svr, parameters)

所以我的问题是:如何定义my_内核,以便GridSearchCV给出M变量?

您可能需要创建一个包装器类。比如:

class MySVC(BaseEstimator,ClassifierMixin):
    def __init__( self, 
              # all the SVC attributes
              M ):
         self.M = M
         # etc...

    def fit( self, X, y ):
         kernel = lambda x,y : np.dot(np.dot(x,M),y.T)
         self.svc_ = SVC( kernel=kernel, # the other parameters )
         return self.svc_.fit( X, y )
    def predict( self, X ):
         return self.svc_.predict( X )
    # et cetera