前処理

正規化の代表的な手法 z-score normalization と min-max normalization

データ分析や機械学習をする際にキーとなるステップの1つがデータの前処理です。今回は前処理の代表的な手法である正規化についてまとめてみました!

正規化の代表的な手法 z-score normalization と min-max normalization

なぜ前処理が必要になるか?

簡単に説明すると、パラメータが複数あったときにそれぞれスケールが違うと、計算するときにスケールの違いに値が引っ張られてしまうのを防ぐため。

例えば、身長と体重が挙げられる。
違う尺度での計算を避けるため、0から1の値に変換する場合がほとんど。
この0から1への変換をスケーリングといい、正規化などの様々な方法がある。

正規化(normalization)の代表的な手法

正規化(normalization)の代表的な手法に、

  1. z-score normalization
  2. min-max normalization

がある

1. z-score normalization

以下の式で値が0から1になるように変換すること

x_new = (x - x_mean) / x_std

データxから平均(x_mean)を引き、その値を標準偏差(x_std)で割っている
そのため、正規化よりも外れ値に強くなる。

2. min-max normalization

以下の式で値が0から1になるように変換すること

x_new = (x - x_min) / (x_max - x_min)

最小値・最大値を使った方法では標本のデータしか見ていないため、最大値・最小値に強く影響を受けてしまう。したがって、外れ値などが混ざっていると結局大きく引っ張られてしまう。

pandasのDataFrameで2つの正規化を書いてみた

"""
1. z-score normalization
以下の式で変換
x_new = (x - x_mean) / x_std
外れ値にもロバスト
"""
standardized_sample_df = (sample_df - sample_df.mean()) / sample_df.std()
print(standardized_sample_df)
"""
2. min-max normalization
以下の式で0から1になるように変換
x_new = (x - x_min) / (x_max - x_min)
minとmaxに強く影響をされてしまう
"""
normalized_sample_df = (sample_df - sample_df.min()) / (sample_df.max() - sample_df.min())
print(normalized_sample_df)

結局どっちを使えばいいのか?

どちらを扱うにしても、注意しなければならない点があります。それは、訓練データとテストデータを同時(同じ尺度)でスケーリングしなければならないことです。

同じ尺度でスケーリングしないと、違う母集団レベルで計算してしまうことになってしまって、精度が極端に落ちてしまいます。

注意点を踏まえた上で正規化と標準化のどっちを使えばよいかの個人的な判断基準を以下にまとめます。

  1. もともと母集団レベルで最大値と最小値の範囲が決まっているときなどはmin-maxを扱う方が計算しやすい
  2. 最大値・最小値に上限、下限がない場合は、z-scoreを使う

未知のテストデータに対して、スケーリングをどのように適用すればよいか、まだ理解が足りていないので引き続き調べていきます。(どなたかいい知見を持っている方がいましたら、教えていただけるとうれしいです。)

まとめ

本記事では、データ分析や機械学習をする際に必要な前処理の代表的な手法である正規化についてまとめてみました!

-前処理