Ajustement des hyperparamètres en Python
Alex Scriven
Data Scientist
Inutile de réinventer la roue. Rappelons les étapes d'une recherche par grille :
Il n'y a qu'une seule différence :
C'est tout ! (ou presque)
Les modules sont semblables aussi :
GridSearchCV :
sklearn.model_selection.GridSearchCV(estimator, param_grid,
scoring=None, fit_params=None,
n_jobs=None,
refit=True, cv='warn', verbose=0,
pre_dispatch='2*n_jobs',
error_score='raise-deprecating',
return_train_score='warn')
RandomizedSearchCV :
sklearn.model_selection.RandomizedSearchCV(estimator,
param_distributions, n_iter=10,
scoring=None, fit_params=None,
n_jobs=None, refit=True,
cv='warn', verbose=0,
pre_dispatch='2*n_jobs',
random_state=None,
error_score='raise-deprecating',
return_train_score='warn')
Deux différences clés :
n_iter, soit le nombre d'échantillons que la recherche aléatoire prélève dans votre grille. Dans l'exemple précédent, vous en avez pris 300.
param_distributions diffère légèrement de param_grid et permet de définir au besoin une distribution d'échantillonnage.
Nous pouvons maintenant créer un objet de recherche aléatoire comme pour la recherche par grille, avec un petit changement :
# Définir l'espace d'échantillonnage learn_rate_list = np.linspace(0.001,2,150) min_samples_leaf_list = list(range(1,51)) # Créer la grille parameter_grid = { 'learning_rate' : learn_rate_list, 'min_samples_leaf' : min_samples_leaf_list}# Définir le nombre d'échantillons number_models = 10
Nous pouvons maintenant construire l'objet :
# Créer un objet de recherche aléatoire
random_GBM_class = RandomizedSearchCV(
estimator = GradientBoostingClassifier(),
param_distributions = parameter_grid,
n_iter = number_models,
scoring='accuracy',
n_jobs=4,
cv = 10,
refit=True,
return_train_score = True)
# Ajuster l'objet à nos données
random_GBM_class.fit(X_train, y_train)
La sortie est identique !
Comment voir les valeurs d'hyperparamètres choisies ?
Le dictionnaire cv_results_ (dans les colonnes param_ correspondantes) !
Extraire les listes :
rand_x = list(random_GBM_class.cv_results_['param_learning_rate'])
rand_y = list(random_GBM_class.cv_results_['param_min_samples_leaf'])
Construire notre visualisation :
# S'assurer de bien fixer les limites en X et Y x_lims = [np.min(learn_rate_list), np.max(learn_rate_list)] y_lims = [np.min(min_samples_leaf_list), np.max(min_samples_leaf_list)]# Tracer les résultats de la grille plt.scatter(rand_y, rand_x, c=['blue']*10) plt.gca().set(xlabel='learn_rate', ylabel='min_samples_leaf', title='Random Search Hyperparameters') plt.show()
Un graphique semblable à tout à l'heure :

Ajustement des hyperparamètres en Python