Source code for pretab.transformers.feature_maps.rbf
import numpy as np
from ...core.params import UNSET
from ._base import BaseCenterExpansion
[docs]
class RBFExpansionTransformer(BaseCenterExpansion):
r"""
Radial Basis Function (RBF) feature expansion for numerical tabular data.
This transformer expands each feature into a set of RBF (Gaussian) basis functions
centered at fixed points. The centers can be determined either by a target-aware
selector (based on supervised splits) or based on quantiles or uniform spacing.
Parameters
----------
output_dim : int, default=6
Number of RBF centers (output columns) per feature.
gamma : float, default=1.0
Width parameter of the RBF kernel. Larger values make the kernel narrower.
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
List of arrays containing center locations for each 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 is a
Gaussian radial basis function
.. math::
\phi_i(x) = \exp\left(-\gamma (x - c_i)^2\right),
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 RBFExpansionTransformer
>>> X = np.array([[1.0], [2.0], [3.0]])
>>> transformer = RBFExpansionTransformer(output_dim=3, gamma=0.5, target_aware=False, placement_strategy="uniform")
>>> transformer.fit(X)
RBFExpansionTransformer(...)
>>> transformer.transform(X).shape
(3, 3)
"""
_feature_suffix_value = "rbf"
[docs]
def __init__(
self,
output_dim=UNSET,
gamma: float = 1.0,
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,
)
self.gamma = gamma
def _expand_column(self, x_col, centers):
return np.exp(-self.gamma * (x_col - centers[np.newaxis, :]) ** 2)