web-dev-qa-db-ja.com

リバースボックス-歯車変換

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
20
Gyan Veda

@Warren Weckesserのおかげで、SciPyの現在の実装には、Box-Cox変換を元に戻す機能がないことを学びました。ただし、将来のSciPyリリースにはこの機能が含まれる可能性があります。今のところ、私の質問で提供するコードは、他の人がBox-Cox変換を逆にするのに役立つ可能性があります。

4
Gyan Veda
  1. これがコードです。それは機能していて、ただテストしています。 Scipyはネペリア対数を使用しました。BoxCox変換ペーパーを確認すると、log10が使用されていることがわかります。 scipyで動作するため、neperianを使用しました
  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)
    
13
Mauro Damo

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.])
8
jeffhale