Uso de un conjunto de validación explícito (predefinido) para la búsqueda en cuadrícula con sklearn

Tengo un conjunto de datos, que previamente se ha dividido en 3 conjuntos: entrenamiento, validación y prueba. Estos conjuntos deben usarse como se indica para poder comparar el rendimiento en diferentes algoritmos.

Ahora me gustaría optimizar los parámetros de mi SVM usando el conjunto de validación. Sin embargo, no puedo encontrar cómo ingresar el conjunto de validación explícitamente en sklearn.grid_search.GridSearchCV() . A continuación se incluye un código que he usado anteriormente para realizar la validación cruzada K-fold en el conjunto de entrenamiento. Sin embargo, para este problema necesito usar el conjunto de validación como se indica. ¿Cómo puedo hacer eso?

 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) 

Use PredefinedSplit

 ps = PredefinedSplit(test_fold=your_test_fold) 

luego establece cv=ps en GridSearchCV

test_fold: “array-like, shape (n_samples,)

test_fold [i] proporciona el pliegue del conjunto de prueba de la muestra i. Un valor de -1 indica que la muestra correspondiente no forma parte de ningún pliegue del conjunto de prueba, sino que siempre se colocará en el pliegue de entrenamiento.

También vea aquí

al usar un conjunto de validación, establezca test_fold en 0 para todas las muestras que forman parte del conjunto de validación, y en -1 para todas las demás muestras.

Considere usar el paquete hypopt Python ( pip install hypopt ) para el cual soy autor. Es un paquete profesional creado específicamente para la optimización de parámetros con un conjunto de validación. Funciona con cualquier modelo listo para usar de scikit-learn y se puede usar con Tensorflow, PyTorch, Caffe2, etc. también.

 # 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)) 

EDITAR: Yo (creo que) recibí -1 en esta respuesta porque estoy sugiriendo un paquete que escribí. Esto es desafortunado, dado que el paquete fue creado específicamente para resolver este tipo de problema.