Comparando la búsqueda aleatorizada y la búsqueda en cuadrícula para la estimación de hiperparámetros

Compara la búsqueda aleatorizada y la búsqueda en cuadrícula para optimizar los hiperparámetros de una SVM lineal con entrenamiento SGD. Todos los parámetros que influyen en el aprendizaje se buscan simultáneamente (excepto el número de estimadores, que plantea una compensación de tiempo/calidad).

La búsqueda aleatorizada y la búsqueda en cuadrícula exploran exactamente el mismo espacio de parámetros. El resultado en la configuración de los parámetros es bastante similar, mientras que el tiempo de ejecución de la búsqueda aleatorizada es drásticamente inferior.

El rendimiento puede ser ligeramente peor para la búsqueda aleatorizada, y es probable que se deba a un efecto de ruido y no se trasladaría a un conjunto de pruebas retenidas.

Ten en cuenta que, en la práctica, no se buscaría entre tantos parámetros diferentes simultáneamente utilizando la búsqueda en cuadrícula, sino que se elegirían sólo los que se consideran más importantes.

Out:

RandomizedSearchCV took 35.82 seconds for 20 candidates parameter settings.
Model with rank: 1
Mean validation score: 0.927 (std: 0.027)
Parameters: {'alpha': 0.0002699147053638122, 'average': True, 'l1_ratio': 0.3255168291320971}

Model with rank: 2
Mean validation score: 0.925 (std: 0.027)
Parameters: {'alpha': 0.00016802254765477988, 'average': True, 'l1_ratio': 0.5914282288536643}

Model with rank: 3
Mean validation score: 0.919 (std: 0.028)
Parameters: {'alpha': 0.00031160731820877675, 'average': True, 'l1_ratio': 0.7713596052031082}

GridSearchCV took 170.85 seconds for 100 candidate parameter settings.
Model with rank: 1
Mean validation score: 0.934 (std: 0.031)
Parameters: {'alpha': 1.0, 'average': False, 'l1_ratio': 0.0}

Model with rank: 2
Mean validation score: 0.929 (std: 0.025)
Parameters: {'alpha': 0.0001, 'average': True, 'l1_ratio': 0.0}

Model with rank: 3
Mean validation score: 0.928 (std: 0.027)
Parameters: {'alpha': 0.001, 'average': True, 'l1_ratio': 0.0}

print(__doc__)

import numpy as np

from time import time
import scipy.stats as stats
from sklearn.utils.fixes import loguniform

from sklearn.model_selection import GridSearchCV, RandomizedSearchCV
from sklearn.datasets import load_digits
from sklearn.linear_model import SGDClassifier

# get some data
X, y = load_digits(return_X_y=True)

# build a classifier
clf = SGDClassifier(loss='hinge', penalty='elasticnet',
                    fit_intercept=True)


# Utility function to report best scores
def report(results, n_top=3):
    for i in range(1, n_top + 1):
        candidates = np.flatnonzero(results['rank_test_score'] == i)
        for candidate in candidates:
            print("Model with rank: {0}".format(i))
            print("Mean validation score: {0:.3f} (std: {1:.3f})"
                  .format(results['mean_test_score'][candidate],
                          results['std_test_score'][candidate]))
            print("Parameters: {0}".format(results['params'][candidate]))
            print("")


# specify parameters and distributions to sample from
param_dist = {'average': [True, False],
              'l1_ratio': stats.uniform(0, 1),
              'alpha': loguniform(1e-4, 1e0)}

# run randomized search
n_iter_search = 20
random_search = RandomizedSearchCV(clf, param_distributions=param_dist,
                                   n_iter=n_iter_search)

start = time()
random_search.fit(X, y)
print("RandomizedSearchCV took %.2f seconds for %d candidates"
      " parameter settings." % ((time() - start), n_iter_search))
report(random_search.cv_results_)

# use a full grid over all parameters
param_grid = {'average': [True, False],
              'l1_ratio': np.linspace(0, 1, num=10),
              'alpha': np.power(10, np.arange(-4, 1, dtype=float))}

# run grid search
grid_search = GridSearchCV(clf, param_grid=param_grid)
start = time()
grid_search.fit(X, y)

print("GridSearchCV took %.2f seconds for %d candidate parameter settings."
      % (time() - start, len(grid_search.cv_results_['params'])))
report(grid_search.cv_results_)

Tiempo total de ejecución del script: (3 minutos 26.776 segundos)

Galería generada por Sphinx-Gallery