ここでは機械学習を行う際の特徴量のスケーリングとして「正規化」と「標準化」の使い分けについて解説しています。
特徴量のスケーリングとは
特徴量のスケーリングとは、機械学習の前処理のことです。
代表的なものに「正規化」と「標準化」があります。
結論から言って、正規化と標準化を使い分けるコツは以下です。
正規化 | 最大値及び最小値が決まっている場合 ex)画像処理など |
標準化 | 最大値及び最小値が決まっていない場合や外れ値が存在する場合 |
正規化とは
正規化(min-max normalization)とは、データの最大値が1、最小値が0になるように整形することです。
式にすると以下になります。
xi = (xi-Xmin)/(Xmax-Xmin)
正規化を用いた使用例
import pandas as pd, numpy as np
f = pd.DataFrame({
"num":[100,130,200,340,498,537]
})
def cal(f,k):
x = f[k]
x_max = x.max()
x_min = x.min()
f[k] = (x - x_min) / (x_max - x_min)
cal(f,"num")
print(f)
任意のリストを作成して予め最小値100、最大値537がわかっている場合の正規化プログラムです。
結果は以下の通りです。
num
0 0.000000
1 0.068650
2 0.228833
3 0.549199
4 0.910755
5 1.000000
最小値100に対して0、最大値537に対して1になっているので正規化できたことが分かります。
例えば、桁違いの数値のような外れ値が出てきてしまうと正常に計算できないことが想像できます。
そこで標準化を行う必要が出てきます。
標準化とは
標準化(z-score normalization)とは、元のデータの平均を0として標準偏差が1のものに変換することです。
つまり、平均よりも大きい測定値の標準化は正となり、平均よりも小さい測定値の標準化は負となると言えます。
式にすると以下になります。
標準化=(測定値-平均)/標準偏差
標準化を用いた使用例
import pandas as pd, numpy as np
f = pd.Series([100,130,200,340,498,537])
def cal(f,axis = None):
f = f.values
x_mean = f.mean(axis=axis, keepdims=True)
x_s = np.std(f, axis=axis, keepdims=True)
num_re = (f - x_mean) / x_s
return num_re
ff = cal(f)
print(ff)
正規化で用いた数値を使用して標準化しました。
出力結果は以下の通りです。
[-1.17305123 -0.99782366 -0.58895933 0.22876933 1.15163453 1.37943037]
最後に
特徴量のスケーリングは正規化、標準化を使い分けることが可能です。
最後は自分の頭で考えて選択する必要がありますね。