Creación de transformadores personalizados con FunctionTransformer#

Uso básico#

[1]:
import numpy as np
from sklearn.preprocessing import FunctionTransformer

transformer = FunctionTransformer(
    # -------------------------------------------------------------------------
    # The callable to use for the transformation.
    func=np.log1p, # log_e(1+x)
    # -------------------------------------------------------------------------
    # The callable to use for the inverse transformation
    inverse_func=None,
    # -------------------------------------------------------------------------
    # Dictionary of additional keyword arguments to pass to func.
    kw_args=None,
    # -------------------------------------------------------------------------
    # Dictionary of additional keyword arguments to pass to inverse_func.
    inv_kw_args=None,
)
X = np.array([[0, 1], [2, 3], [4, 5]])
transformer.transform(X)
[1]:
array([[0.        , 0.69314718],
       [1.09861229, 1.38629436],
       [1.60943791, 1.79175947]])

Funciones comunes usadas para la transformación de datos en modelos de regresión#

  • Logaritmo (natural):

w = \log (z)

  • Logaritmo base 10:

w = \log_{10} (z)

  • Logística:

    w = \log \left[ \frac{c \cdot z}{1 - c \cdot z} \right]

    con:

    c = (1 - 10^{-6}) \cdot 10 ^{-\text{ceil} (\log_{10} (\max (z)))}

    donde la función ceil() retorna el entero más pequeño que es igual o mayor que z.

  • Raíz cuadrada:

    w = z^{1/2}

  • Raíz cúbica:

    w = z^{1/3}

  • Box-Cox:

    w = \begin{cases} \frac{z^\lambda - 1}{\lambda}, & \lambda \ne 0 \\ \\ \log{z}, & \lambda = 0 \end{cases}

Implementación de la transformación de Box-Cox#

[2]:
def box_cox(x, lambda_=0):
    if lambda_ == 0:
        return np.log(x)
    return (np.power(x, lambda_) - 1) / lambda_


def inverse_box_cox(x, lambda_=0):
    if lambda_ == 0:
        return np.exp(x)
    return np.power(lambda_ * x + 1, 1 / lambda_)


transformer = FunctionTransformer(
    func=box_cox,
    inverse_func=inverse_box_cox,
    kw_args=dict(lambda_=1.),
    inv_kw_args=dict(lambda_=1),
)
X = np.array([[1, 2], [3, 4], [5, 6]])
X_transf = transformer.transform(X)
X_transf
[2]:
array([[0., 1.],
       [2., 3.],
       [4., 5.]])
[3]:
transformer.inverse_transform(X_transf)
[3]:
array([[1., 2.],
       [3., 4.],
       [5., 6.]])