Source code for pretab.transformers.feature_maps.tanh

import numpy as np

from ...core.params import UNSET
from ._base import BaseCenterExpansion


[docs] class TanhExpansionTransformer(BaseCenterExpansion): r""" Applies hyperbolic tangent (tanh) basis expansion to input features using specified or learned center locations. This transformer expands each input feature into multiple tanh-activated features, useful for capturing nonlinear and saturating patterns in the data. Parameters ---------- output_dim : int, default=6 Number of tanh centers (output columns) per feature. scale : float, default=1.0 Controls the sharpness of the tanh transitions. Smaller values make the activation sharper. 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 center values for each input feature used in the tanh expansion. total_output_dim_ : int Total number of output columns across all features (fitted). Notes ----- Each original feature :math:`x` is transformed into ``output_dim`` features of the form .. math:: \tanh\!\left(\frac{x - c}{s}\right), where :math:`c` is a center value and :math:`s` (``scale``) controls the spread of the activation 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 TanhExpansionTransformer >>> X = np.array([[1.0], [2.0], [3.0]]) >>> transformer = TanhExpansionTransformer(output_dim=3, target_aware=False, placement_strategy="uniform") >>> transformer.fit(X) TanhExpansionTransformer(...) >>> transformer.transform(X).shape (3, 3) """ _feature_suffix_value = "tanh"
[docs] def __init__( self, output_dim=UNSET, scale: 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.scale = scale
def _expand_column(self, x_col, centers): return np.tanh((x_col - centers[np.newaxis, :]) / self.scale)