Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Scikit-learn: scoring in GridSearchCV

It seems that GridSearchCV of scikit-learn collects the scores of its (inner) cross-validation folds and then averages across the scores of all folds. I was wondering about the rationale behind this. At first glance, it would seem more flexible to instead collect the predictions of its cross-validation folds and then apply the chosen scoring metric to the predictions of all folds.

The reason I stumbled upon this is that I use GridSearchCV on an imbalanced data set with cv=LeaveOneOut() and scoring='balanced_accuracy' (scikit-learn v0.20.dev0). It doesn't make sense to apply a scoring metric such as balanced accuracy (or recall) to each left-out sample. Rather, I would want to collect all predictions first and then apply my scoring metric once to all predictions. Or does this involve an error in reasoning?

Update: I solved it by creating a custom grid search class based on GridSearchCV with the difference that predictions are first collected from all inner folds and the scoring metric is applied once.

like image 985
monade Avatar asked Nov 07 '22 13:11

monade


1 Answers

GridSearchCVuses the scoring to decide what internal hyperparameters to set in the model.

If you want to estimate the performance of the "optimal" hyperparameters, you need to do an additional step of cross validation.

See http://scikit-learn.org/stable/auto_examples/model_selection/plot_nested_cross_validation_iris.html

EDIT to get closer to answering the actual question: For me it seems reasonable to collect predictions for each fold and then score them all, if you want to use LeaveOneOut and balanced_accuracy. I guess you need to make your own grid searcher to do that. You could use model_selection.ParameterGrid and model_selection.KFold for that.

like image 153
KPLauritzen Avatar answered Dec 29 '22 17:12

KPLauritzen