2014-07-06 7 views
7

Özel çekirdek işlevim var ve SVC (kernel = my_kernel) ile GridSearchCV işlevini kullanıyorum.Scikit-learn'deki özel kerneller için grid araması ile parametrelerin ayarlanması mümkün mü?

my_kernel işlevi, ayarlama yapmak için bir k parametresi alır; bu nedenle, özel çekirdek işlevimin parametresini ayarlamak için param_grid seçeneğini yapılandırmanın mümkün olup olmadığını merak ediyordum. Örneğin, RBF çekirdeği için gamma parametresini aşağıdaki gibi ayarlamak mümkündür. Özel çekirdeğim için bir param_grid = dict (k = k_range) seçeneği sağlayabilir miyim? Bunu yapmak için

gamma_range = 10. ** np.arange(-5, 4) 
param_grid = dict(gamma=gamma_range) 
grid = GridSearchCV(SVC(), param_grid=param_grid, cv=StratifiedKFold(y=Y, k=5)) 

cevap

10

bir yolu Pipeline, SVC(kernel='precomputed') kullanarak ve bir sklearn tahmincisi) (BaseEstimator ve TransformerMixin bir alt sınıf) olarak özel çekirdek işlevini tamamlıyor.

Örneğin, sklearn özellik vektörü X ve Y çekirdek matrisi oluşturulur bir custom kernel functionchi2_kernel(X, Y=None, gamma=1.0) içerir. Bu işlev, tercihen çapraz doğrulama kullanılarak ayarlanması gereken gamma parametresini alır. şöyle Bu fonksiyon parametreleri üzerinde ızgara arama yapabilirsiniz:

from __future__ import print_function 
from __future__ import division 

import sys 

import numpy as np 

import sklearn 
from sklearn.base import BaseEstimator, TransformerMixin 
from sklearn.cross_validation import train_test_split 
from sklearn.datasets import load_digits 
from sklearn.grid_search import GridSearchCV 
from sklearn.metrics import accuracy_score 
from sklearn.metrics.pairwise import chi2_kernel 
from sklearn.pipeline import Pipeline 
from sklearn.svm import SVC 

# Wrapper class for the custom kernel chi2_kernel 
class Chi2Kernel(BaseEstimator,TransformerMixin): 
    def __init__(self, gamma=1.0): 
     super(Chi2Kernel,self).__init__() 
     self.gamma = gamma 

    def transform(self, X): 
     return chi2_kernel(X, self.X_train_, gamma=self.gamma) 

    def fit(self, X, y=None, **fit_params): 
     self.X_train_ = X 
     return self 

def main(): 

    print('python: {}'.format(sys.version)) 
    print('numpy: {}'.format(np.__version__)) 
    print('sklearn: {}'.format(sklearn.__version__)) 
    np.random.seed(0) 

    # Get some data to evaluate 
    dataset = load_digits() 
    X = dataset.data 
    y = dataset.target 
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33) 

    # Create a pipeline where our custom predefined kernel Chi2Kernel 
    # is run before SVC. 
    pipe = Pipeline([ 
     ('chi2', Chi2Kernel()), 
     ('svm', SVC()), 
    ]) 

    # Set the parameter 'gamma' of our custom kernel by 
    # using the 'estimator__param' syntax. 
    cv_params = dict([ 
     ('chi2__gamma', 10.0**np.arange(-9,4)), 
     ('svm__kernel', ['precomputed']), 
     ('svm__C', 10.0**np.arange(-2,9)), 
    ]) 

    # Do grid search to get the best parameter value of 'gamma'. 
    model = GridSearchCV(pipe, cv_params, cv=5, verbose=1, n_jobs=-1) 
    model.fit(X_train, y_train) 
    y_pred = model.predict(X_test) 
    acc_test = accuracy_score(y_test, y_pred) 

    print("Test accuracy: {}".format(acc_test)) 
    print("Best params:") 
    print(model.best_params_) 

if __name__ == '__main__': 
    main() 

Çıktı: Senin durumunda

python: 2.7.3 (default, Dec 18 2014, 19:10:20) 
    [GCC 4.6.3] 
    numpy: 1.8.0 
    sklearn: 0.16.1 
    Fitting 5 folds for each of 143 candidates, totalling 715 fits 
    [Parallel(n_jobs=-1)]: Done 1 jobs  | elapsed: 0.4s 
    [Parallel(n_jobs=-1)]: Done 50 jobs  | elapsed: 2.7s 
    [Parallel(n_jobs=-1)]: Done 200 jobs  | elapsed: 9.8s 
    [Parallel(n_jobs=-1)]: Done 450 jobs  | elapsed: 21.6s 
    [Parallel(n_jobs=-1)]: Done 701 out of 715 | elapsed: 34.8s remaining: 0.7s 
    [Parallel(n_jobs=-1)]: Done 715 out of 715 | elapsed: 35.4s finished 
    Test accuracy: 0.989898989899 
    Best params: 
    {'chi2__gamma': 0.01, 'svm__C': 10.0, 'svm__kernel': 'precomputed'} 

, sadece çekirdek matris hesaplar sizin fonksiyonu ile chi2_kernel değiştirin.

+0

yapabilirsiniz (https://en.wikipedia.org/wiki/Kernel_ (istatistikler) #Kernel_functions_in_common_use) Tommi'nin örneğini kullanarak. turşu Can not: 'PicklingError: Ben bu hatayı almaya devam o epanechnikov_kernel.EpanechnikovKernel' Başka [StackOverflow cevap] (http://stackoverflow.com/ aynı nesne değil soruları/1412787/picklingerror-cant-pickle-class-ondalık-ondalık-değil-aynı-nesne) '% load_ext autoreload 'autoreload 2' kapatmayı önerir, ama yine de bu hatayı alıyorum. Fikirler? –

+0

, standart olmayan/özel dönüşümleri serileştiren 'dill 'paket tutamaçlarını diğer dekapaj yöntemlerinden daha iyi bulabilirsiniz. –

0

linked question numaralı belgede belirtildiği gibi ... auto-sklearn ile otomatik bir parametre ayarını kullanmaya ne dersiniz? Bu, sklearn'in yerini alır ve sıklıkla manuel olarak ayarlanmış parametrelerden daha iyi bir iş çıkarır.

1

0.19 scikit-öğrenme ile, ne [Epanechnikov kernel] uygulamak çalışıyorum

from sklearn.kernel_ridge import KernelRidge 
from sklearn.metrics.pairwise import chi2_kernel 

reg_kridge=KernelRidge(kernel='chi2') 
params_grid={"gamma":np.logspace(0,-4,5)} 
reg=GridSearchCV(reg_kridge,params_grid, n_jobs=-1,cv=10,scoring='neg_mean_squared_error') 
reg.fit(train, target) 
İlgili konular