python - example - Uso de un conjunto de validación explícita(predefinido) para la búsqueda en cuadrícula con sklearn
k fold cross validation python example (2)
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 la forma de 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)
Considere la posibilidad de utilizar el paquete Python hypopt
( 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 utilizar 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.
Use PredefinedSplit
ps = PredefinedSplit(test_fold=your_test_fold)
a continuación, establezca 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 here
cuando utilice 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.