Source code for pretab.transformers.feature_maps.relu
import numpy as np
from ...core.params import UNSET
from ._base import BaseCenterExpansion
[docs]
class ReLUExpansionTransformer(BaseCenterExpansion):
r"""
Applies ReLU basis expansion to input features using fixed or data-driven center placement.
This transformer expands each feature using a set of ReLU activation functions centered at fixed positions,
which can be either uniformly/quantile spaced or determined by a target-aware selector based on the target.
Parameters
----------
output_dim : int, default=6
Number of ReLU centers (output columns) per feature.
target_aware : bool, default=False
Whether to place centers with a target-aware selector (requires `y`).
placement_strategy : {"cart", "lightgbm", "uniform", "quantile"}, optional
Selector when `target_aware=True` (`"cart"` or `"lightgbm"`); spacing when
`target_aware=False` (`"uniform"` or `"quantile"`). If left unset, resolves
to `"cart"` on the target-aware path and `"quantile"` otherwise.
task : {"regression", "classification"}, default="regression"
Task type for the target-aware selector used to place centers.
adaptive : bool, default=False
If True (with `target_aware=True`), the per-feature number of centers may
vary within `[min_output_dim, max_output_dim]` instead of being fixed to
`output_dim`. Has no effect on the `quantile` / `uniform` paths.
min_output_dim : int or None, default=None
Lower bound on the per-feature number of centers in adaptive mode.
max_output_dim : int or None, default=None
Upper bound on the per-feature number of centers in adaptive mode.
random_state : int or None, default=None
Random state forwarded to the target-aware selector for reproducibility.
Attributes
----------
centers_ : list of ndarray
A list of arrays containing the center locations for each input feature.
total_output_dim_ : int
Total number of output columns across all features (fitted).
Notes
-----
For a feature :math:`x` and centers :math:`c_i`, each output column applies a
rectified linear unit
.. math::
\phi_i(x) = \max(0,\; x - c_i),
producing ``output_dim`` new features per original feature on the
non-target-aware path; the target-aware default may place a data-driven number.
Examples
--------
>>> import numpy as np
>>> from pretab.transformers import ReLUExpansionTransformer
>>> X = np.array([[1.0], [2.0], [3.0]])
>>> transformer = ReLUExpansionTransformer(output_dim=3, target_aware=False, placement_strategy="uniform")
>>> transformer.fit(X)
ReLUExpansionTransformer(...)
>>> transformer.transform(X).shape
(3, 3)
"""
_feature_suffix_value = "relu"
[docs]
def __init__(
self,
output_dim=UNSET,
target_aware: bool = False,
placement_strategy=UNSET,
task: str = "regression",
adaptive: bool = False,
min_output_dim=UNSET,
max_output_dim=UNSET,
random_state: int | None = None,
):
super().__init__(
output_dim=output_dim,
target_aware=target_aware,
placement_strategy=placement_strategy,
task=task,
adaptive=adaptive,
min_output_dim=min_output_dim,
max_output_dim=max_output_dim,
random_state=random_state,
)
def _expand_column(self, x_col, centers):
return np.maximum(0, x_col - centers[np.newaxis, :])