2016-05-11 3 views
8

Я ищу способ построения grid_scores_ из GridSearchCV в sklearn. В этом примере я пытаюсь выполнить поиск наилучших параметров гамма и С для алгоритма SVR. Мой код выглядит следующим образом:Как скопировать сетку с GridSearchCV?

C_range = 10.0 ** np.arange(-4, 4) 
    gamma_range = 10.0 ** np.arange(-4, 4) 
    param_grid = dict(gamma=gamma_range.tolist(), C=C_range.tolist()) 
    grid = GridSearchCV(SVR(kernel='rbf', gamma=0.1),param_grid, cv=5) 
    grid.fit(X_train,y_train) 
    print(grid.grid_scores_) 

После того как я запустить код и распечатать результаты сетки, которые я получаю следующий результат:

[mean: -3.28593, std: 1.69134, params: {'gamma': 0.0001, 'C': 0.0001}, mean: -3.29370, std: 1.69346, params: {'gamma': 0.001, 'C': 0.0001}, mean: -3.28933, std: 1.69104, params: {'gamma': 0.01, 'C': 0.0001}, mean: -3.28925, std: 1.69106, params: {'gamma': 0.1, 'C': 0.0001}, mean: -3.28925, std: 1.69106, params: {'gamma': 1.0, 'C': 0.0001}, mean: -3.28925, std: 1.69106, params: {'gamma': 10.0, 'C': 0.0001},etc] 

Я хотел бы, чтобы визуализировать все результаты (средние значения) в зависимости от гамма и С. График Я пытаюсь получить должен выглядеть следующим образом:

enter image description here

Где ось х гамма, ось у является средним баллом (среднеквадратическая ошибка в данном случае), а также различные линии представляют собой разные C значения.

ответ

7
from sklearn.svm import SVC 
from sklearn.grid_search import GridSearchCV 
from sklearn import datasets 
import matplotlib.pyplot as plt 
import seaborn as sns 
import numpy as np 

digits = datasets.load_digits() 
X = digits.data 
y = digits.target 

clf_ = SVC(kernel='rbf') 
Cs = [1, 10, 100, 1000] 
Gammas = [1e-3, 1e-4] 
clf = GridSearchCV(clf_, 
      dict(C=Cs, 
       gamma=Gammas), 
       cv=2, 
       pre_dispatch='1*n_jobs', 
       n_jobs=1) 

clf.fit(X, y) 

scores = [x[1] for x in clf.grid_scores_] 
scores = np.array(scores).reshape(len(Cs), len(Gammas)) 

for ind, i in enumerate(Cs): 
    plt.plot(Gammas, scores[ind], label='C: ' + str(i)) 
plt.legend() 
plt.xlabel('Gamma') 
plt.ylabel('Mean score') 
plt.show() 
  • Кодекс основывается на this.
  • только озадачивает часть: будет sklearn всегда соблюдать порядок C & Gamma -> Официальный пример использует этот "порядок"

Выход:

Example plot

2

Порядок, в котором сетка параметр является пройденный является детерминированным, так что его можно перестроить и построить прямо. Что-то вроде этого:

scores = [entry.mean_validation_score for entry in grid.grid_scores_] 
# the shape is according to the alphabetical order of the parameters in the grid 
scores = np.array(scores).reshape(len(C_range), len(gamma_range)) 
for c_scores in scores: 
    plt.plot(gamma_range, c_scores, '-') 
+0

«# форма находится в соответствии с алфавитным порядком параметров в сетке» - У вас есть некоторые ссылки для этого (предпочтительно от Документов)? – sascha

+0

Я нашел часть в кодовой базе sklearns в grid_search.py, но я думаю, что это не упоминается в документах. – sascha

+0

Вы правы, это следует упомянуть, а это не так. Доктриум ParameterGrid обеспечивает детерминированный порядок, который следует за этим соглашением, поэтому он протестирован; он также используется в примере 'plot_rbf_parameters ', который, по-видимому, имеет две строки по совпадению, почти идентичные тем, которые я вам дал. Если вы обеспокоены тем, что этот заказ ненадежен, вы всегда можете просто отсортировать «grid_scores_» самостоятельно. – joeln

10

Код, указанный @sascha, верен. Однако атрибут grid_scores_ скоро будет устарел. Лучше использовать атрибут cv_results.

Это может быть implemente аналогичным образом, что и метод @sascha:

def plot_grid_search(cv_results, grid_param_1, grid_param_2, name_param_1, name_param_2): 
    # Get Test Scores Mean and std for each grid search 
    scores_mean = cv_results['mean_test_score'] 
    scores_mean = np.array(scores_mean).reshape(len(grid_param_2),len(grid_param_1)) 

    scores_sd = cv_results['std_test_score'] 
    scores_sd = np.array(scores_sd).reshape(len(grid_param_2),len(grid_param_1)) 

    # Plot Grid search scores 
    _, ax = plt.subplots(1,1) 

    # Param1 is the X-axis, Param 2 is represented as a different curve (color line) 
    for idx, val in enumerate(grid_param_2): 
     ax.plot(grid_param_1, scores_mean[idx,:], '-o', label= name_param_2 + ': ' + str(val)) 

    ax.set_title("Grid Search Scores", fontsize=20, fontweight='bold') 
    ax.set_xlabel(name_param_1, fontsize=16) 
    ax.set_ylabel('CV Average Score', fontsize=16) 
    ax.legend(loc="best", fontsize=15) 
    ax.grid('on') 

# Calling Method 
plot_grid_search(pipe_grid.cv_results_, n_estimators, max_features, 'N Estimators', 'Max Features') 

Приведенные выше результаты в следующем сюжете:

enter image description here

0

Я хотел сделать что-то подобное (но масштабируется до большого количества параметров), и вот мое решение для генерации ройных графиков выхода:

score = pd.DataFrame(gs_clf.grid_scores_).sort_values(by='mean_validation_score', ascending = False) 
for i in parameters.keys(): 
    print(i, len(parameters[i]), parameters[i]) 
score[i] = score.parameters.apply(lambda x: x[i]) 
l =['mean_validation_score'] + list(parameters.keys()) 
for i in list(parameters.keys()): 
    sns.swarmplot(data = score[l], x = i, y = 'mean_validation_score') 
    #plt.savefig('170705_sgd_optimisation//'+i+'.jpg', dpi = 100) 
    plt.show() 

SGDclassifier Loss Function Example