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

Я использую функцию Boxcox SciPy для выполнения преобразования 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

Ответ 1

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

Ответ 2

  • Вот код. Он работает и просто проверяет. Scipy использовал неперский логарифм, я проверяю бумагу преобразования BoxCox, и он видит, что они использовали log10. Я держался с неперианцем, потому что он работает с scipy
  • Следуйте коду:

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