dask / dask/dask-ml

PCA.transform fails if svd_solver="randomized"

Open
#1,023 1 comment 0 reactions 0 assignees View on GitHub
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.