Обратное преобразование Box-Cox

Я использую составляющей в выполнить преобразование 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

затем я приспосабливаю статистическую модель для прогнозирования значений этой преобразованной переменной 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)

однако я не могу найти функцию SciPy, которая выполняет обратное преобразование Box-Cox даны преобразованные данные и лямбда. Есть ли такая функция? я закодировал обратное преобразование на данный момент.

pred_y = np.power((y_box * lambda_) + 1, 1 / lambda_) - 1

3 ответов


  1. вот это код. Это работает и просто тест. Сципион использовал неперианский логарифм, я проверяю бумагу преобразования BoxCox, и он видит, что они использовали log10. Я держался с неперианом, потому что он работает со 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)
    

SciPy добавил обратное преобразование Box-Cox.

https://docs.scipy.org/doc/scipy/reference/generated/scipy.special.inv_boxcox.html

scipy.специальный.inv_boxcox составляющей.специальный.inv_boxcox (y, lmbda) =

вычислить обратное преобразование Box-Cox.

Найти x такой, что:

y = (x**lmbda - 1) / lmbda  if lmbda != 0
    log(x)                  if lmbda == 0

параметры: y : array_like

данные для преобразования.

lmbda : array_like

параметр мощности преобразования Box-Cox.

возвращает:
х : массив

преобразованных данных.

Примечания

новое в версии 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.])

благодаря @Warren Weckesser я узнал, что текущая реализация SciPy не имеет функции для обратного преобразования Box-Cox. Однако будущий выпуск SciPy может иметь эту функцию. На данный момент код, который я предоставляю в своем вопросе, может служить другим для обратного преобразования Box-Cox.