Gya*_*eda 18 python statistics transformation inverse scipy
我正在使用SciPy的boxcox函数对连续变量执行Box-Cox变换.
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
Run Code Online (Sandbox Code Playgroud)
然后,我拟合一个统计模型来预测这个Box-Cox变换变量的值.模型预测是Box-Cox量表,我想将它们转换为变量的原始比例.
from sklearn.ensemble import RandomForestRegressor
rf = RandomForestRegressor()
X = np.random.random((100, 100))
rf.fit(X, y_box)
pred_box = rf.predict(X)
Run Code Online (Sandbox Code Playgroud)
但是,在找到转换数据和lambda的情况下,我找不到执行反向Box-Cox变换的SciPy函数.有这样的功能吗?我现在编码一个逆变换.
pred_y = np.power((y_box * lambda_) + 1, 1 / lambda_) - 1
Run Code Online (Sandbox Code Playgroud)
小智 13
遵循以下代码:
#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)
Run Code Online (Sandbox Code Playgroud)SciPy添加了逆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)=
计算Box-Cox变换的倒数.
找到x这样:
y = (x**lmbda - 1) / lmbda if lmbda != 0
log(x) if lmbda == 0
Run Code Online (Sandbox Code Playgroud)
参数:y:array_like
要转换的数据.
lmbda:array_like
Box-Cox变换的功率参数.
返回:
x:array
转化数据.
笔记
版本0.16.0中的新功能.
例:
from scipy.special import boxcox, inv_boxcox
y = boxcox([1, 4, 10], 2.5)
inv_boxcox(y, 2.5)
output: array([1., 4., 10.])
Run Code Online (Sandbox Code Playgroud)
感谢@Warren Weckesser,我了解到 SciPy 的当前实现没有反转 Box-Cox 转换的函数。不过,未来的 SciPy 版本可能会具有此功能。目前,我在问题中提供的代码可能会帮助其他人逆转 Box-Cox 转换。