反向Box-Cox变换

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

  1. 这是代码.它正在工作,只是测试.Scipy使用了neperian对数,我检查了BoxCox转换文件,并且看到他们使用了log10.我和neperian一起,因为它与scipy一起使用
  2. 遵循以下代码:

    #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)


jef*_*ale 8

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)


Gya*_*eda 6

感谢@Warren Weckesser,我了解到 SciPy 的当前实现没有反转 Box-Cox 转换的函数。不过,未来的 SciPy 版本可能会具有此功能。目前,我在问题中提供的代码可能会帮助其他人逆转 Box-Cox 转换。