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:
# /// 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:
The expected output is:
fit_transform worked
Traceback (most recent call last):
File "/home/zottel/workspace/dask-ml-pca/mwe.py", line 22, in <module>
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.
Describe the issue:
dask_ml.decomposition.PCA.transformfails after runningdask_ml.decomposition.PCA.fitforsvd_solver="randomized":This does not happen for
dask_ml.decomposition.PCA.fit_transformMinimal Complete Verifiable Example:
Assuming this snippet is saved as
mwe.py, run withuv:The expected output is:
Anything else we need to know?:
I was able to reproduce this error with Python versions 3.12, 3.13, and 3.14.
Environment:
1.8.03.12,3.13,3.14