python - normal - scipy.stats install
Transformación inversa caja-cox (3)
Estoy usando la función boxcox de SciPy para realizar una transformación de Box-Cox en una variable continua.
from scipy.stats import boxcox
import numpy as np
y = np.random.random(100)
y_box, lambda_ = ss.boxcox(y + 1) # Add 1 to be able to transform 0 values
Luego, instalo un modelo estadístico para predecir los valores de esta variable transformada de Box-Cox. Las predicciones del modelo están en la escala de Box-Cox y quiero transformarlas a la escala original de la variable.
from sklearn.ensemble import RandomForestRegressor
rf = RandomForestRegressor()
X = np.random.random((100, 100))
rf.fit(X, y_box)
pred_box = rf.predict(X)
Sin embargo, no puedo encontrar una función SciPy que realice una transformación inversa de Box-Cox con datos transformados y lambda. ¿Existe tal función? Codifiqué una transformación inversa por ahora.
pred_y = np.power((y_box * lambda_) + 1, 1 / lambda_) - 1
- Aquí está el código. Está funcionando y solo prueba. Scipy utilizó logaritmo neperiano, verifico el papel de transformación de BoxCox y parece que usaron log10. Seguí con neperiano, porque funciona con scipy.
Sigue el código:
#Function def invboxcox(y,ld): if ld == 0: return(np.exp(y)) else: return(np.exp(np.log(ld*y+1)/ld)) # Test the code x=[100] ld = 0 y = stats.boxcox(x,ld) print invboxcox(y[0],ld)
Gracias a @Warren Weckesser, he aprendido que la implementación actual de SciPy no tiene una función para revertir una transformación de Box-Cox. Sin embargo, una futura versión de SciPy puede tener esta función. Por ahora, el código que proporciono en mi pregunta puede servir a otros para revertir las transformaciones de Box-Cox.
SciPy ha añadido una transformación inversa de Box-Cox.
https://docs.scipy.org/doc/scipy/reference/generated/scipy.special.inv_boxcox.html
scipy.special.inv_boxcox scipy.special.inv_boxcox (y, lmbda) =
Calcula el inverso de la transformación de Box-Cox.
Encuentra x tal que:
y = (x**lmbda - 1) / lmbda if lmbda != 0
log(x) if lmbda == 0
Parámetros: y: array_like
Datos a transformar.
lmbda: array_like
Parámetro de potencia de la transformada de Box-Cox.
Devoluciones:
x: array
Datos transformados.
Notas
Nuevo en la versión 0.16.0.
Ejemplo:
from scipy.special import boxcox, inv_boxcox
y = boxcox([1, 4, 10], 2.5)
inv_boxcox(y, 2.5)
output: array([1., 4., 10.])