check_regressor_multioutput does not allow np.float32 predictions

### Describe the bug

When testing my scikit-learn interface for my NN regressor, `check_regressor_multioutput` fails with an
`AssertionError: Multioutput predictions by a regressor are expected to be floating-point precision. Got float32 instead`
This is because the check only checks for `np.float64`. I can resolve this by casting the resulting array to `np.float64`, but then `check_methods_subset_invariance` fails instead because it applies a smaller tolerance for `float64` arrays.

Judging from the error message, I would guess that `np.float32` should be allowed in `check_regressor_multioutput`.

### Steps/Code to Reproduce

```python
import numpy as np
from sklearn.base import BaseEstimator, RegressorMixin
from sklearn.utils.estimator_checks import check_regressor_multioutput


class MyRegressor(BaseEstimator, RegressorMixin):
    def fit(self, X, y):
        self.y_dim_ = y.shape[1]

    def predict(self, X):
        return np.zeros(shape=(X.shape[0], self.y_dim_), dtype=np.float32)


reg = MyRegressor()
check_regressor_multioutput('MyRegressor', reg)
```

### Expected Results

No error is thrown (at least not for this reason).

### Actual Results

```pytb
Traceback (most recent call last):
  File "bug_report_multioutput.py", line 15, in <module>
    check_regressor_multioutput('MyRegressor', reg)
  File "python3.10/site-packages/sklearn/utils/_testing.py", line 156, in wrapper
    return fn(*args, **kwargs)
  File "python3.10/site-packages/sklearn/utils/estimator_checks.py", line 2136, in check_regressor_multioutput
    assert y_pred.dtype == np.dtype("float64"), (
AssertionError: Multioutput predictions by a regressor are expected to be floating-point precision. Got float32 instead
```

### Versions

```shell
System:
    python: 3.10.12 (main, Jun 11 2023, 05:26:28) [GCC 11.4.0]
executable: /home/david/prog/venvs/tab_bench_venv/bin/python3.10
   machine: Linux-6.2.0-36-generic-x86_64-with-glibc2.35

Python dependencies:
      sklearn: 1.3.2
          pip: 22.0.2
   setuptools: 59.6.0
        numpy: 1.24.3
        scipy: 1.10.1
       Cython: None
       pandas: 1.5.3
   matplotlib: 3.7.1
       joblib: 1.2.0
threadpoolctl: 3.1.0

Built with OpenMP: True

threadpoolctl info:
       user_api: blas
   internal_api: openblas
         prefix: libopenblas
       filepath: /media/data/prog/venvs/tab_bench_venv/lib/python3.10/site-packages/numpy.libs/libopenblas64_p-r0-15028c96.3.21.so
        version: 0.3.21
threading_layer: pthreads
   architecture: Zen
    num_threads: 16

       user_api: openmp
   internal_api: openmp
         prefix: libgomp
       filepath: /media/data/prog/venvs/tab_bench_venv/lib/python3.10/site-packages/scikit_learn.libs/libgomp-a34b3233.so.1.0.0
        version: None
    num_threads: 16

       user_api: blas
   internal_api: openblas
         prefix: libopenblas
       filepath: /media/data/prog/venvs/tab_bench_venv/lib/python3.10/site-packages/scipy.libs/libopenblasp-r0-41284840.3.18.so
        version: 0.3.18
threading_layer: pthreads
   architecture: Zen
    num_threads: 16
```

COMMENT:
> I would appreciate your insights. Do you think it might be beneficial to consider adding a feature to extend the API for handling np.float32 predictions, or is using the dtype in fit a reasonable workaround for now?

Yes but this would require a lot of work and should be proposed through a "scikit-learn enhancement proposal" (SLEP) since this an impactful change in the API.

Labels: Enhancement