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
次に、統計モデルを当てはめて、この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)
しかし、変換されたデータとラムダが与えられた場合、逆のBox-Cox変換を実行するSciPy関数が見つかりません。そのような関数はありますか?今のところ逆変換をコーディングしました。
pred_y = np.power((y_box * lambda_) + 1, 1 / lambda_) - 1
@Warren Weckesserのおかげで、SciPyの現在の実装には、Box-Cox変換を元に戻す機能がないことを学びました。ただし、将来のSciPyリリースにはこの機能が含まれる可能性があります。今のところ、私の質問で提供するコードは、他の人がBox-Cox変換を逆にするのに役立つ可能性があります。
コードに従ってください:
#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.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
パラメータ:y:array_like
変換するデータ。
lmbda:array_like
Box-Cox変換のパワーパラメーター。
戻り値:
x:配列
変換されたデータ。
ノート
バージョン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.])