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.]])