GridSearchCV.verbose documentation does not match actual behavior (values >3, >10)

### Describe the issue linked to the documentation

[`GridSearchCV` docs ](https://scikit-learn.org/1.7/modules/generated/sklearn.model_selection.GridSearchCV.html) state

> **verbose** int
> Controls the verbosity: the higher, the more messages.
> \>1 : the computation time for each fold and parameter candidate is displayed;
> \>2 : the score is also displayed;
> \>3 : the fold and candidate parameter indexes are also displayed together with the starting time of the computation.

In reality, this param is passed to joblib [here](https://github.com/scikit-learn/scikit-learn/blob/d3898d9d57aeb1e960d266613a2e31b07bca39d7/sklearn/model_selection/_search.py#L1009), whose [docs](https://joblib.readthedocs.io/en/latest/generated/joblib.Parallel.html) state:
> **verbose**: int, default=0
> The verbosity level: if non zero, progress messages are printed. Above 50, the output is sent to stdout. The frequency of the messages increases with the verbosity level. If it more than 10, all iterations are reported.

Testing with the MRE below shows that 0 is silent, 1 prints one line, 2 prints a line for each CV split. 3-9 are all the same. 10-inf are all the same

### MRE:
```python
from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification

X, y = make_classification()

clf = LogisticRegression(max_iter=100)

param_grid = {"C": [1, 2]}

for v in [0, 1, 2, 3, 9, 10, 1000]:
    print(f"\n=======  verbose={v}  ======= ")
    gs = GridSearchCV(
        clf,
        param_grid,
        cv=2,
        n_jobs=1,
        verbose=v,
    )
    gs.fit(X, y)
```

It is possible taht the same issue exists elsewhere, I've not looked thoroughly

### Suggest a potential alternative/fix

Update docs to match observed behaviour, e.g.:

> **verbose** int
> Controls the verbosity: the higher, the more messages.
> 0 : no messages;
> 1 : a single line describing the number of folds, the number of candidates, and the number of fits;
> 2 : the above, plus when each fold ends, the computation time for that fold and parameter candidate is displayed;
> 3-9 : the above, plus the fold index and the score is also displayed;
> ≥10 : an additional message for the start of each fold, and the candidate parameter indexes are also displayed.

COMMENT:
> Ups, just to clarify, I had actually intended to ask if there was a delay between END of the previous iteration and START of the next, and there isn't (at least not with the current example and `n_samples=5_000_000`).

Right, agreed.

> But I have seen there actually IS some additional information between `verbosity< 9` and `verbosity>9 ` (which is not the additional START): the indices of the parameter candidates are then also displayed in `[CV 2/2; 1/2]`. It is the second set (`1/2` here) which means index of param `C` (1) of total number of indices for param `C` (2). So it is worth mentioning the option of verbosity=10 and higher.

Right - I didn't explain this too well in my message but that is what I meant with "and the candidate parameter indexes are also displayed" in my suggested docs update
TBH it feels like verbose could be simplified. I'd also argue that which param candidate index is more important than which fold index, so that the progress of a large grid search can be tracked. I'd advocate for the output looking like

```diff
=======  verbose=0  ======= 

=======  verbose=1  ======= 
Fitting 2 folds for each of 2 candidates, totalling 4 fits

=======  verbose=2  ======= 
Fitting 2 folds for each of 2 candidates, totalling 4 fits
- [CV] END ................................................C=1; total time=   0.0s
- [CV] END ................................................C=1; total time=   0.0s
- [CV] END ................................................C=2; total time=   0.0s
- [CV] END ................................................C=2; total time=   0.0s
+ [Cand 1/2] ............C=1; mean_score=0.900; std_score=0.02; total time=   0.0s
+ [Cand 2/2] ............C=2; mean_score=0.950; std_score=0.03; total time=   0.0s
 
=======  verbose=3  ======= 
Fitting 2 folds for each of 2 candidates, totalling 4 fits
- [CV 1/2] END ...............................C=1;, score=0.900 total time=   0.0s
- [CV 2/2] END ...............................C=1;, score=0.900 total time=   0.0s
- [CV 1/2] END ...............................C=2;, score=0.900 total time=   0.0s
- [CV 2/2] END ...............................C=2;, score=0.900 total time=   0.0s
+ [Cand 1/2, CV 1/2] ..........................C=1; score=0.900 total time=   0.0s
+ [Cand 1/2, CV 2/2] ..........................C=1; score=0.900 total time=   0.0s
+ [Cand 2/2, CV 1/2] ..........................C=2; score=0.900 total time=   0.0s
+ [Cand 2/2, CV 2/2] ..........................C=2; score=0.900 total time=   0.0s
```

so only 0,1,2,3 are valid settings. 
- 0 = silent (unchanged); 
- 1 = one-liner overview (unchanged); 
- 2 = tracking param combination candidates, with their mean scores (and possibly stds); 
- 3 = tracking each split for each candidate. 

When we track each candidate / split, we print all info about that candidate / split as we're anyway outputting a line about it and the extra info can't hurt. Those just seem like much more clearly defined options than what we have currently.   
I guess it depends on whether there is appetite for changing behaviour vs simply fixing docs.

Labels: Documentation