Skip to content

cca_zoo.preprocessing

Per-view sklearn preprocessing adapters for multiview pipelines.


PerViewTransformer

PerViewTransformer(
    transformer: BaseEstimator | list[BaseEstimator],
)

Bases: BaseEstimator

Apply an sklearn transformer to each view separately.

Fits a clone per view, taking and returning a list of views, so it chains with multiview estimators in a :class:~sklearn.pipeline.Pipeline.

Parameters:

Name Type Description Default
transformer BaseEstimator | list[BaseEstimator]

A transformer, cloned per view, or one per view.

required

Attributes:

Name Type Description
transformers_

The fitted transformer of each view.

Examples:

>>> import numpy as np
>>> from sklearn.decomposition import PCA
>>> from sklearn.pipeline import Pipeline
>>> from sklearn.preprocessing import StandardScaler
>>> from cca_zoo.linear import CCA
>>> from cca_zoo.preprocessing import PerViewTransformer
>>> rng = np.random.default_rng(0)
>>> X1, X2 = rng.standard_normal((50, 20)), rng.standard_normal((50, 15))
>>> pipe = Pipeline([
...     ("scale", PerViewTransformer(StandardScaler())),
...     ("pca", PerViewTransformer(PCA(n_components=5))),
...     ("cca", CCA(n_components=2)),
... ])
>>> Z1, Z2 = pipe.fit_transform([X1, X2])
Source code in cca_zoo/preprocessing/_view_transformer.py
def __init__(self, transformer: BaseEstimator | list[BaseEstimator]) -> None:
    self.transformer = transformer

fit

fit(
    views: list[ArrayLike], y: None = None
) -> PerViewTransformer

Fit the model.

Parameters:

Name Type Description Default
views list[ArrayLike]

Arrays of shape (n_samples, n_features_i), one per view.

required
y None

Ignored.

None

Returns:

Type Description
PerViewTransformer

self.

Source code in cca_zoo/preprocessing/_view_transformer.py
def fit(self, views: list[ArrayLike], y: None = None) -> PerViewTransformer:
    """Fit the model.

    Args:
        views: Arrays of shape (n_samples, n_features_i), one per view.
        y: Ignored.

    Returns:
        self.
    """
    self._validate_params()
    validated = validate_views(views, ensure_all_finite=False)
    self.transformers_: list[BaseEstimator] = [
        clone(t).fit(v)
        for t, v in zip(self._transformers_for(len(validated)), validated)
    ]
    return self

transform

transform(views: list[ArrayLike]) -> list[np.ndarray]

Transform each view with its fitted transformer.

Parameters:

Name Type Description Default
views list[ArrayLike]

Arrays of shape (n_samples, n_features_i), one per view.

required

Returns:

Type Description
list[ndarray]

The transformed views.

Raises:

Type Description
ValueError

If there are not as many views as in fit.

Source code in cca_zoo/preprocessing/_view_transformer.py
def transform(self, views: list[ArrayLike]) -> list[np.ndarray]:
    """Transform each view with its fitted transformer.

    Args:
        views: Arrays of shape (n_samples, n_features_i), one per view.

    Returns:
        The transformed views.

    Raises:
        ValueError: If there are not as many views as in fit.
    """
    return [t.transform(v) for t, v in zip(self.transformers_, self._fitted(views))]

fit_transform

fit_transform(
    views: list[ArrayLike], y: None = None
) -> list[np.ndarray]

Fit, then transform the training views.

Parameters:

Name Type Description Default
views list[ArrayLike]

Arrays of shape (n_samples, n_features_i), one per view.

required
y None

Ignored.

None

Returns:

Type Description
list[ndarray]

The transformed views.

Source code in cca_zoo/preprocessing/_view_transformer.py
def fit_transform(self, views: list[ArrayLike], y: None = None) -> list[np.ndarray]:
    """Fit, then transform the training views.

    Args:
        views: Arrays of shape (n_samples, n_features_i), one per view.
        y: Ignored.

    Returns:
        The transformed views.
    """
    return self.fit(views, y).transform(views)

inverse_transform

inverse_transform(
    views: list[ArrayLike],
) -> list[np.ndarray]

Map transformed views back to their original feature spaces.

Parameters:

Name Type Description Default
views list[ArrayLike]

Transformed views.

required

Returns:

Type Description
list[ndarray]

The views in their original feature spaces.

Raises:

Type Description
ValueError

If there are not as many views as in fit.

Source code in cca_zoo/preprocessing/_view_transformer.py
def inverse_transform(self, views: list[ArrayLike]) -> list[np.ndarray]:
    """Map transformed views back to their original feature spaces.

    Args:
        views: Transformed views.

    Returns:
        The views in their original feature spaces.

    Raises:
        ValueError: If there are not as many views as in fit.
    """
    return [
        t.inverse_transform(v)
        for t, v in zip(self.transformers_, self._fitted(views))
    ]

__sklearn_tags__

__sklearn_tags__() -> Tags

Tags marking list-of-views input, which sklearn's checks cannot validate.

Source code in cca_zoo/preprocessing/_view_transformer.py
def __sklearn_tags__(self) -> Tags:
    """Tags marking list-of-views input, which sklearn's checks cannot validate."""
    tags = super().__sklearn_tags__()
    tags.no_validation = True
    tags.input_tags.two_d_array = False
    tags._skip_test = True
    return tags