2014-10-15 3 views
12

Я использую SciPy's boxcox function для выполнения Box-Cox transformation на непрерывной переменной.Обратное преобразование 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, которая выполняет обратное преобразование Бокса-Кокса данную преобразованные данные и лямбда. Есть ли такая функция? На данный момент я закодировал обратное преобразование.

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

Это кажется очень хороший вопрос. –

+2

Обратная функция Box-Cox находится в версии scipy development (т. Е. Ведущей ветви на https://github.com/scipy/scipy) и будет доступна в версии 0.16. См. Https://github.com/scipy/scipy/pull/4211 –

ответ

1

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

+0

Для справки, он уже доступен здесь: https://docs.scipy.org/doc/scipy-0.19.0/reference/generated/scipy. special.inv_boxcox.html # scipy.special.inv_boxcox –

9
  1. Здесь приводится код. Он работает и просто проверяет. Scipy использовал неперский логарифм, я проверяю бумагу преобразования 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) 
    
Смежные вопросы