SimpleImputer converts `int32[pyarrow]` extension array to `float64`, subsequently crashing with numpy `int32` values

### Describe the bug

When using the `SimpleImputer` with a pyarrow-backed pandas DataFrame, any float/integer data is converted to `None`/`float64` instead.
This causes the imputer to be fitted to `float64`, crashing on a dtype assertion when passing it a numpy-backed `int32` DataFrame after fitting.

The flow is the following:
1. The imputer calls `_validate_input`:
  https://github.com/scikit-learn/scikit-learn/blob/675736ae9e3f360975e1f5b477a8eba68a376ba9/sklearn/impute/_base.py#L319
2. This calls `validate_data`:
  https://github.com/scikit-learn/scikit-learn/blob/675736ae9e3f360975e1f5b477a8eba68a376ba9/sklearn/impute/_base.py#L344-L353
3. This calls `check_array`:
  https://github.com/scikit-learn/scikit-learn/blob/675736ae9e3f360975e1f5b477a8eba68a376ba9/sklearn/utils/validation.py#L2951-L2952
4. Our input is a pandas dataframe:
  https://github.com/scikit-learn/scikit-learn/blob/675736ae9e3f360975e1f5b477a8eba68a376ba9/sklearn/utils/validation.py#L909
5. This now checks if the dtypes need to be converted:
  https://github.com/scikit-learn/scikit-learn/blob/675736ae9e3f360975e1f5b477a8eba68a376ba9/sklearn/utils/validation.py#L925-L927
6. Our input is backed by an extension array _and_ `int32[pyarrow]` is an integer datatype, so we return `True` here:
  https://github.com/scikit-learn/scikit-learn/blob/675736ae9e3f360975e1f5b477a8eba68a376ba9/sklearn/utils/validation.py#L714-L724
7. Finally we pass the "needs conversion" check and convert the dataframe to `dtype` (which is `None` here, which apparently means `float64`):
  https://github.com/scikit-learn/scikit-learn/blob/675736ae9e3f360975e1f5b477a8eba68a376ba9/sklearn/utils/validation.py#L966-L971

### Steps/Code to Reproduce

```py
import polars as pl
from sklearn.impute import SimpleImputer
import numpy as np

print(
    SimpleImputer(missing_values=np.nan, strategy='constant', fill_value=0)
      .fit(pl.DataFrame({"a": [10]}, schema={"a": pl.Int32}).to_pandas(use_pyarrow_extension_array=False))
      ._fit_dtype
)
# prints dtype('int32'), as expected

print(
    SimpleImputer(missing_values=np.nan, strategy='constant', fill_value=0)
      .fit(pl.DataFrame({"a": [10]}, schema={"a": pl.Int32}).to_pandas(use_pyarrow_extension_array=True))
      ._fit_dtype
)
# prints dtype('float64') (!!)
```


### Expected Results

Both imputers should be fitted with `int32` values.

### Actual Results

The imputer using the pyarrow extension array is fitted with `float64`.

This causes crashes when using the Imputer with normal `int32` columns backed by numpy, as they won't be converted and therefore the dtypes differ.

### Versions

```shell
System:
    python: 3.12.9 (main, Mar 11 2025, 17:26:57) [Clang 20.1.0 ]
executable: /tmp/scikit/.venv/bin/python3
   machine: Linux-6.14.4-arch1-2-x86_64-with-glibc2.41

Python dependencies:
      sklearn: 1.6.1
          pip: None
   setuptools: None
        numpy: 2.2.5
        scipy: 1.15.3
       Cython: None
       pandas: 2.2.3
   matplotlib: None
       joblib: 1.5.0
threadpoolctl: 3.6.0

Built with OpenMP: True

threadpoolctl info:
       user_api: blas
   internal_api: openblas
    num_threads: 16
         prefix: libscipy_openblas
       filepath: /tmp/scikit/.venv/lib/python3.12/site-packages/numpy.libs/libscipy_openblas64_-6bb31eeb.so
        version: 0.3.28
threading_layer: pthreads
   architecture: Haswell

       user_api: blas
   internal_api: openblas
    num_threads: 16
         prefix: libscipy_openblas
       filepath: /tmp/scikit/.venv/lib/python3.12/site-packages/scipy.libs/libscipy_openblas-68440149.so
        version: 0.3.28
threading_layer: pthreads
   architecture: Haswell

       user_api: openmp
   internal_api: openmp
    num_threads: 16
         prefix: libgomp
       filepath: /tmp/scikit/.venv/lib/python3.12/site-packages/scikit_learn.libs/libgomp-a34b3233.so.1.0.0
        version: None
```

COMMENT:
All good. Yes, e.g. just adding a random transform:

```py
import polars as pl
from sklearn.impute import SimpleImputer
import numpy as np
import pandas as pd

imputer = SimpleImputer(missing_values=np.nan, strategy="constant", fill_value=0).fit(
    pl.DataFrame({"a": [10]}, schema={"a": pl.Int32}).to_pandas(
        use_pyarrow_extension_array=False
    )
)

# prints dtype('int32'), as expected
print(imputer._fit_dtype)
# Returns [[10]]
print(imputer.transform(pd.DataFrame({"a": [10]}).astype("int32")))

print("\n\nAnd the second")

imputer = SimpleImputer(missing_values=np.nan, strategy="constant", fill_value=0).fit(
    pl.DataFrame({"a": [10]}, schema={"a": pl.Int32}).to_pandas(
        use_pyarrow_extension_array=True
    )
)

# prints dtype('float64') (!!)
print(imputer._fit_dtype)
# Crashes
print(imputer.transform(pd.DataFrame({"a": [10]}).astype("int32")))
```

```
int32
[[10]]


And the second
float64
File "/tmp/foobar/foo.py", line 28, in <module>
    print(imputer.transform(pd.DataFrame({"a": [10]})))
          ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/i_al_istannen/.cache/uv/archive-v0/7JJYEACxwIFWBoES19ZZl/lib/python3.13/site-packages/sklearn/utils/_set_output.py", line 316, in wrapped
    data_to_wrap = f(self, X, *args, **kwargs)
  File "/home/i_al_istannen/.cache/uv/archive-v0/7JJYEACxwIFWBoES19ZZl/lib/python3.13/site-packages/sklearn/impute/_base.py", line 609, in transform
    X = self._validate_input(X, in_fit=False)
  File "/home/i_al_istannen/.cache/uv/archive-v0/7JJYEACxwIFWBoES19ZZl/lib/python3.13/site-packages/sklearn/impute/_base.py", line 414, in _validate_input
    raise ValueError(err_msg)
ValueError: The dtype of the filling value (i.e. dtype('float64')) cannot be cast to the input data that is dtype('int32'). Make sure that the dtypes of the input data are of the same kind between fit and transform.
```

Labels: Bug, module:impute