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