PCA.transform fails if svd_solver="randomized"
- Dominant language
- Python
- Stars
- 951
- Forks
- 262
- PR merge metrics
- No merged PRs in 30d
Description
**Describe the issue**:
`dask_ml.decomposition.PCA.transform` fails after running `dask_ml.decomposition.PCA.fit` for `svd_solver="randomized"`:
```
AttributeError: 'PCA' object has no attribute 'power_iteration_normalizer'
```
This does not happen for `dask_ml.decomposition.PCA.fit_transform`
**Minimal Complete Verifiable Example**:
```python
# /// script
# requires-python = "==3.14"
# dependencies = [
# "dask-ml==2025.1.0",
# "scikit-learn==1.8.0",
# ]
# ///
import dask.array as da
from dask_ml.decomposition import PCA
from sklearn.datasets import load_breast_cancer
data = da.asarray(load_breast_cancer().data)
solver = "randomized"
pca1 = PCA(svd_solver=solver)
data1 = pca1.fit_transform(data)
print("fit_transform worked")
pca2 = PCA(svd_solver=solver)
pca2.fit(data)
data2 = pca2.transform(data)
print("fit, then transform worked")
```
Assuming this snippet is saved as `mwe.py`, run with [`uv`](https://docs.astral.sh/uv):
```
uv run mwe.py
```
The expected output is:
```
fit_transform worked
Traceback (most recent call last):
File "/home/zottel/workspace/dask-ml-pca/mwe.py", line 22, in
data2 = pca2.transform(data)
File "/home/zottel/.cache/uv/environments-v2/mwe-fa30d1c07b89220f/lib/python3.14/site-packages/sklearn/utils/_set_output.py", line 316, in wrapped
data_to_wrap = f(self, X, *args, **kwargs)
File "/home/zottel/.cache/uv/environments-v2/mwe-fa30d1c07b89220f/lib/python3.14/site-packages/dask_ml/decomposition/pca.py", line 373, in transform
check_is_fitted(self, ["mean_", "components_"])
~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/zottel/.cache/uv/environments-v2/mwe-fa30d1c07b89220f/lib/python3.14/site-packages/sklearn/utils/validation.py", line 1699, in check_is_fitted
tags = get_tags(estimator)
File "/home/zottel/.cache/uv/environments-v2/mwe-fa30d1c07b89220f/lib/python3.14/site-packages/sklearn/utils/_tags.py", line 275, in get_tags
tags = estimator.__sklearn_tags__()
File "/home/zottel/.cache/uv/environments-v2/mwe-fa30d1c07b89220f/lib/python3.14/site-packages/sklearn/decomposition/_pca.py", line 845, in __sklearn_tags__
solver == "randomized" and self.power_iteration_normalizer == "QR"
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'PCA' object has no attribute 'power_iteration_normalizer'
```
**Anything else we need to know?**:
I was able to reproduce this error with Python versions 3.12, 3.13, and 3.14.
**Environment**:
- Dask version: `1.8.0`
- Python version: `3.12`, `3.13`, `3.14`
- Operating System: Linux (but reproduced on macOS as well)
- Install method: uv from pypi.org through inline script dependencies defined in the snippet above.
Contributor guide
Assessment
This issue has not been assessed yet.