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 en gran medida 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 denomina validación cruzada anidada. Puede ver 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 su necesidad:
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 la validación cruzada anidada con cross_val_score() y GridSearchCV()
clf, X, y, outer_cv a cross_val_scoreX se dividirá en X_outer_train, X_outer_test usando outer_cv . Lo mismo para Y.X_outer_test se retendrá y X_outer_train se pasará a clf para fit() (GridSearchCV en nuestro caso). Suponga que X_outer_train se llama X_inner de aquí en adelante, ya que se pasa al estimador interno , suponga que y_outer_train es y_inner .X_inner ahora se dividirá en X_inner_train y X_inner_test usando inner_cv en GridSearchCV. lo mismo para tiX_inner_train y y_train_inner y se calificará con X_inner_test y y_inner_test .(X_inner_train, X_inner_test) es mejor, se pasan a clf.best_estimator_ y se ajustan para todos los datos, es decir, X_outer_train .clf ( gridsearch.best_estimator_ ) luego se calificará usando X_outer_test y y_outer_test .cross_val_scorenested_score .Puede proporcionar diferentes generadores de validación cruzada a GridSearchCV . El valor predeterminado para problemas de clasificación binaria o multiclase es StratifiedKFold . De lo contrario, usa KFold . Pero usted puede proporcionar su propia. En su caso, parece que quiere 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(...)