2015-07-11 70 views
3

我想通過使用scikit-learn的交叉驗證爲自定義內核SVM執行網格搜索。更確切地說以下this example 我想定義就像在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爲內核的參數(如高斯內核伽馬)內核功能。

我想通過GridSearchCV養活這個參數M,以類似

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

所以我的問題是:如何定義my_kernel使M個變量將由GridSearchCV給予?

回答

0

您可能需要製作一個包裝類。例如:

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