機械学習

【Python】【機械学習】スケーリング(正規化)の範囲を変更する

通常、スケーリング(正規化)は[0, 1]の範囲で行うが、時にはスケーリング後の範囲を変更したい場合もある(かもしれない)

sklearnのMinMaxScalerを使用すれば、引数を変えるだけで計算できるが、sklearnを使うまでもない場合もある。

自分で計算したい時用。

通常([0, 1])のMinMaxScaling

# xi: i番目の値
# x_max: xの最大値
# x_min: xの最小値
# x_norm: 正規化されたxの値

x_norm = ( xi - x_min ) / ( x_max - x_min)

 

一番の基本形。

これで[0, 1]の範囲に収まる。

範囲を指定したMinMaxScaling

# xi: i番目の値
# x_max: xの最大値
# x_min: xの最小値
# sc_max: 正規化したい範囲の右端
# sc_min: 正規化したい範囲の左端
# x_norm: 正規化されたxの値
x_norm = (xi - x_min) / (x_max - x_min) * (sc_max - sc_min) + sc_min

例えばsc_maxに-3, sc_minに3を設定すると[-3, 3]でスケーリングされる。

この計算を行ってくれるのが、sklearnのMinMaxScaler。

 

MinMaxScalerを用いたスケーリング

from skleran.preprocessing import MinMaxScaler
data = [ 1, 2, 3, 4, 5]
arr = np.array(data).reshape(-1,1)

# [0, 1]でスケーリングする場合(デフォルト)
scaler = MinMaxScaler()
scaler.fit(arr)
data_scaled = scaler.transform(arr)

# 範囲指定してスケーリングする場合
sc_min = -1
sc_max = 1
scaler = MinMaxScaler( (sc_min, sc_max) )
scaler.fit(arr)
data_scaled = scaler.transform(arr)

sc_min, sc_maxを指定する場合はタプルで指定することに注意。

計算式としては、手動で実装したのと全く同じことを行うことになる。

データフレームに対して一括でスケーリングするなら、通常はsklearnのMinMaxScalerを使えば良いが、1行ずつ範囲を変えたい場合などは、手動で実装することになる。