web-dev-qa-db-fra.com

Utilisation d'un ensemble de validation explicite (prédéfini) pour la recherche dans la grille avec sklearn

J'ai un jeu de données, qui a été précédemment divisé en 3 ensembles: formation, validation et test. Ces ensembles doivent être utilisés tels qu'ils sont donnés afin de comparer les performances de différents algorithmes.

Je souhaite maintenant optimiser les paramètres de mon SVM à l'aide du jeu de validation. Cependant, je ne trouve pas comment entrer le jeu de validation explicitement dans sklearn.grid_search.GridSearchCV(). Vous trouverez ci-dessous un code que j'ai déjà utilisé pour effectuer une validation croisée K-fold sur l'ensemble de formation. Cependant, pour ce problème, je dois utiliser l'ensemble de validation tel qu'il est indiqué. Comment puis je faire ça?

from sklearn import svm, cross_validation
from sklearn.grid_search import GridSearchCV

# (some code left out to simplify things)

skf = cross_validation.StratifiedKFold(y_train, n_folds=5, shuffle = True)
clf = GridSearchCV(svm.SVC(tol=0.005, cache_size=6000,
                             class_weight=penalty_weights),
                     param_grid=tuned_parameters,
                     n_jobs=2,
                     pre_dispatch="n_jobs",
                     cv=skf,
                     scoring=scorer)
clf.fit(X_train, y_train)
30
pir

Utilisez PredefinedSplit

ps = PredefinedSplit(test_fold=your_test_fold)

puis définissez cv=ps dans GridSearchCV

test_fold: “semblable à un tableau, forme (n_samples,)

test_fold [i] donne le repli de l'ensemble de test de l'échantillon i. Une valeur de -1 indique que l'échantillon correspondant ne fait partie d'aucun pli de test, mais sera toujours placé dans le pli d'apprentissage.

Voir aussi ici

lorsque vous utilisez un ensemble de validation, définissez test_fold sur 0 pour tous les échantillons qui font partie de l'ensemble de validation et sur -1 pour tous les autres échantillons.

29
yangjie

Pensez à utiliser le package hypopt Python (pip install hypopt) dont je suis l'auteur. Il s'agit d'un package professionnel créé spécifiquement pour l'optimisation des paramètres avec un ensemble de validation. Il fonctionne avec n'importe quel modèle scikit-learn prêt à l'emploi et peut également être utilisé avec Tensorflow, PyTorch, Caffe2, etc.

# Code from https://github.com/cgnorthcutt/hypopt
# Assuming you already have train, test, val sets and a model.
from hypopt import GridSearch
param_grid = [
  {'C': [1, 10, 100], 'kernel': ['linear']},
  {'C': [1, 10, 100], 'gamma': [0.001, 0.0001], 'kernel': ['rbf']},
 ]
# Grid-search all parameter combinations using a validation set.
opt = GridSearch(model = SVR(), param_grid = param_grid)
opt.fit(X_train, y_train, X_val, y_val)
print('Test Score for Optimized Parameters:', opt.score(X_test, y_test))

EDIT: J'ai (je pense) reçu -1 sur cette réponse parce que je suggère un package que j'ai créé. C'est regrettable, étant donné que le package a été créé spécifiquement pour résoudre ce type de problème.

8
cgnorthcutt
# Import Libraries
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.model_selection import PredefinedSplit

# Split Data to Train and Validation
X_train, X_val, y_train, y_val = train_test_split(X, y, train_size = 0.8, stratify = y,random_state = 2020)

# Create a list where train data indices are -1 and validation data indices are 0
split_index = [-1 if x in X_train.index else 0 for x in X.index]

# Use the list to create PredefinedSplit
pds = PredefinedSplit(test_fold = split_index)

# Use PredefinedSplit in GridSearchCV
clf = GridSearchCV(estimator = estimator,
                   cv=pds,
                   param_grid=param_grid)

# Fit with all data
clf.fit(X, y)
1