sklearn keys gridsearchcv gradientboostingregressor get_params example estimator cross_val_score python scikit-learn cross-validation grid-search

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

  1. clf = GridSearchCV (estimador, param_grid, cv = inner_cv).
  2. Pase clf, X, y, outer_cv a cross_val_score
  3. Como se ve en el código fuente de cross_val_score , esta X se dividirá en X_outer_train, X_outer_test usando outer_cv . Lo mismo para y.
  4. X_outer_test se X_outer_test y X_outer_train 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 .
  5. X_inner ahora se dividirá en X_inner_train y X_inner_test usando inner_cv en GridSearchCV. Lo mismo para y
  6. Ahora el estimador de gridSearch se entrenará con X_inner_train y y_train_inner y se X_inner_test con X_inner_test y y_inner_test .
  7. Los pasos 5 y 6 se repetirán para inner_cv_iters (5 en este caso).
  8. Los hiperparámetros para los cuales el puntaje promedio sobre todas las iteraciones internas (X_inner_train, X_inner_test) es mejor, se pasa al clf.best_estimator_ y se ajusta a todos los datos, es decir, X_outer_train .
  9. Este clf ( gridsearch.best_estimator_ ) se X_outer_test utilizando X_outer_test y y_outer_test .
  10. 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
  11. 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(...)