stats normal importar has fit attribute python statistics scipy transformation inverse

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


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