问题
I am using SciPy's boxcox function to perform a Box-Cox transformation on a continuous variable.
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
Then, I fit a statistical model to predict the values of this Box-Cox transformed variable. The model predictions are in the Box-Cox scale and I want to transform them to the original scale of the variable.
from sklearn.ensemble import RandomForestRegressor
rf = RandomForestRegressor()
X = np.random.random((100, 100))
rf.fit(X, y_box)
pred_box = rf.predict(X)
However, I can't find a SciPy function that performs a reverse Box-Cox transformation given transformed data and lambda. Is there such a function? I coded an inverse transformation for now.
pred_y = np.power((y_box * lambda_) + 1, 1 / lambda_) - 1
回答1:
- Here it is the code. It is working and just test. Scipy used neperian logarithm, i check the BoxCox transformation paper and it seens that they used log10. I kept with neperian, because it works with scipy
Follow the code:
#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)
回答2:
SciPy has added an inverse Box-Cox transformation.
https://docs.scipy.org/doc/scipy/reference/generated/scipy.special.inv_boxcox.html
scipy.special.inv_boxcox scipy.special.inv_boxcox(y, lmbda) =
Compute the inverse of the Box-Cox transformation.
Find x such that:
y = (x**lmbda - 1) / lmbda if lmbda != 0
log(x) if lmbda == 0
Parameters: y : array_like
Data to be transformed.
lmbda : array_like
Power parameter of the Box-Cox transform.
Returns:
x : array
Transformed data.
Notes
New in version 0.16.0.
Example:
from scipy.special import boxcox, inv_boxcox
y = boxcox([1, 4, 10], 2.5)
inv_boxcox(y, 2.5)
output: array([1., 4., 10.])
回答3:
Thanks to @Warren Weckesser, I've learned that the current implementation of SciPy does not have a function to reverse a Box-Cox transformation. However, a future SciPy release may have this function. For now, the code I provide in my question may serve others to reverse Box-Cox transformations.
来源:https://stackoverflow.com/questions/26391454/reverse-box-cox-transformation