Make `KNeighborsClassifier.predict` and `KNeighborsRegressor.predict` react the same way to `X=None`

### Describe the workflow you want to enable

Currently `KNeighborsRegressor.predict()` accepts `None` as input, in which case it returns prediction for all samples in the training set based on the nearest neighbors not including the sample itself (consistent with `NearestNeighbors` behavior). However, `KNeighborsClassifier.predict()` does not accept `None` as input. This is inconsistent and should arguably be harmonized:

```Python
from sklearn.neighbors import KNeighborsClassifier, KNeighborsRegressor, NearestNeighbors
import numpy as np

X = np.random.normal(size=(10, 5))
y = np.random.normal(size=(10, 1))

knn = NearestNeighbors(n_neighbors=3)
knn.fit(X)
knn.kneighbors() # works

knn = KNeighborsRegressor(n_neighbors=3)
knn.fit(X, y)
knn.predict(None) # works (NB: does not work without "None")

knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X, np.ravel(y) > 0)
knn.predict(None) # fails with an error
```

### Describe your proposed solution

My proposed solution is to make `KNeighborsClassifier.predict(None)` behave the same as `KNeighborsRegressor.predict(None)`. As explained in https://github.com/scikit-learn/scikit-learn/issues/27747, the necessary fix requires changing only two lines of code.


### Additional context

As explained in https://github.com/scikit-learn/scikit-learn/issues/27747, this would be a great feature, super useful and convenient for computing LOOCV accuracy simply via `score(None, y)`. Using `score(X, y)` where `X` is the training set used in `fit(X)` gives a biased result because each (training set) sample gets included into its own neighbors.

COMMENT:
I read the linked discussion and while I initially had the same feeling as @agramfort's initial reaction, I also evolved and I don't see a cheap alternative that would not involve adding new public methods to this estimator to achieve the same results.

So +1 for a PR but it would making that feature explicit in the docstring of the `predict*` and `score` methods, both for the classifier and the regressor.

Also, the PR should include a test on a small toy dataset with randomly generated data that shows that `nn_model.fit(X, y).score(None, y)` is equivalent (or even strictly equal?) to `cross_val_score(nn_model, X, y, cv=LeaveOneOut())`.

It would also be great to check in a side simulation study (in a notebook) to show that the variance of the LOO CV scheme is not significantly larger than the one obtained fors k-fold CV with k in `{5, 10, 50}` and for `n_neighbors` in `{1, 10, 100}` to confirm the outcome of the literature review in https://github.com/scikit-learn/scikit-learn/issues/27747#issuecomment-1806854282. This side notebook should not part of the scikit-learn repo but linked in the PR to help assert that the new feature exposed in the PR is a methodologically sane thing to do. The study should replicate what is described in the "Methodology" section of https://stats.stackexchange.com/a/357749/2150.

> Hello! I could take it to implement if nobody is working on it

If @dkobak was willing to work on such of a PR I would rather let him do so because he seems to have already invested much thoughts and efforts in this feature request.

Labels: New Feature