python - keys - scikit-learn GridSearchCV con mĂșltiples repeticiones
hyperparameters sklearn (2)
Estoy tratando de obtener el mejor conjunto de parámetros para un modelo SVR.
Me gustaría usar
GridSearchCV
sobre diferentes valores de
C
Sin embargo, de la prueba anterior noté que la división en el conjunto de entrenamiento / prueba influye mucho en el rendimiento general (r2 en este caso).
Para abordar este problema, me gustaría implementar una validación cruzada repetida de 5 veces (10 x 5CV).
¿Existe una forma integrada de realizarlo usando
GridSearchCV
?
SOLUCIÓN RÁPIDA:
Siguiendo la idea presentada en la documentación oficial de sci-kit, una solución rápida está representada por:
NUM_TRIALS = 10
scores = []
for i in range(NUM_TRIALS):
cv = KFold(n_splits=5, shuffle=True, random_state=i)
clf = GridSearchCV(estimator=svr, param_grid=p_grid, cv=cv)
scores.append(clf.best_score_)
print "Average Score: {0} STD: {1}".format(numpy.mean(scores), numpy.std(scores))
Esto se llama como validación cruzada anidada. Puede consultar el ejemplo de documentación oficial para guiarlo en la dirección correcta y también ver mi otra respuesta aquí para un enfoque similar.
Puede adaptar los pasos a sus necesidades:
svr = SVC(kernel="rbf")
c_grid = {"C": [1, 10, 100, ... ]}
# CV Technique "LabelKFold", "LeaveOneOut", "LeaveOneLabelOut", etc.
# To be used within GridSearch (5 in your case)
inner_cv = KFold(n_splits=5, shuffle=True, random_state=i)
# To be used in outer CV (you asked for 10)
outer_cv = KFold(n_splits=10, shuffle=True, random_state=i)
# Non_nested parameter search and scoring
clf = GridSearchCV(estimator=svr, param_grid=c_grid, cv=inner_cv)
clf.fit(X_iris, y_iris)
non_nested_score = clf.best_score_
# Pass the gridSearch estimator to cross_val_score
# This will be your required 10 x 5 cvs
# 10 for outer cv and 5 for gridSearch''s internal CV
clf = GridSearchCV(estimator=svr, param_grid=c_grid, cv=inner_cv)
nested_score = cross_val_score(clf, X=X_iris, y=y_iris, cv=outer_cv).mean()
Editar: descripción de validación cruzada anidada con
cross_val_score()
y
GridSearchCV()
- clf = GridSearchCV (estimador, param_grid, cv = inner_cv).
-
Pase
clf, X, y, outer_cv
across_val_score
-
Como se ve en el
código fuente de cross_val_score
, esta
X
se dividirá enX_outer_train, X_outer_test
usandoouter_cv
. Lo mismo para y. -
X_outer_test
seX_outer_test
yX_outer_train
pasará a clf para fit () (GridSearchCV en nuestro caso). Suponga queX_outer_train
se llamaX_inner
de aquí en adelante, ya que se pasa al estimador interno , suponga quey_outer_train
esy_inner
. -
X_inner
ahora se dividirá enX_inner_train
yX_inner_test
usandoinner_cv
en GridSearchCV. Lo mismo para y -
Ahora el estimador de gridSearch se entrenará con
X_inner_train
yy_train_inner
y seX_inner_test
conX_inner_test
yy_inner_test
. - Los pasos 5 y 6 se repetirán para inner_cv_iters (5 en este caso).
-
Los hiperparámetros para los cuales el puntaje promedio sobre todas las iteraciones internas
(X_inner_train, X_inner_test)
es mejor, se pasa alclf.best_estimator_
y se ajusta a todos los datos, es decir,X_outer_train
. -
Este
clf
(gridsearch.best_estimator_
) seX_outer_test
utilizandoX_outer_test
yy_outer_test
. -
Los
pasos 3 a 9 se repetirán
para exterior_cv_iters (10 aquí) y la matriz de puntajes se devolverá de
cross_val_score
-
Luego usamos mean () para recuperar
nested_score
.
Puede suministrar diferentes generadores de validación cruzada a
GridSearchCV
.
El valor predeterminado para problemas de clasificación binaria o multiclase es
StratifiedKFold
.
De lo contrario, utiliza
KFold
.
Pero puedes suministrar el tuyo.
En su caso, parece que desea
RepeatedKFold
o
RepeatedStratifiedKFold
.
from sklearn.model_selection import GridSearchCV, RepeatedStratifiedKFold
# Define svr here
...
# Specify cross-validation generator, in this case (10 x 5CV)
cv = RepeatedKFold(n_splits=5, n_repeats=10)
clf = GridSearchCV(estimator=svr, param_grid=p_grid, cv=cv)
# Continue as usual
clf.fit(...)