【Python】機械学習の前処理正規化 (Normalization) 標準化 (Standardization) 2つの違いは?

【Python】機械学習の前処理正規化 (Normalization) 標準化 (Standardization) 2つの違いは?

まえがき

 機械学習ははただデータをAPIに投げ込めばできるというものではありません。良い結果を得るためには、データをそのまま使うのではなく、効率的に学習できるように加工する必要があります。必要な加工はデータの特性や機械学習で知りたい情報によっても異なります。ですので、適切なデータ加工を行うことはエンジニアの腕の見せ所ともいえるわけです。本日はそんなデータ加工の方法の中で、最もよく使われる規格化と標準化について解説したいと思います。

規格化 (Standardization)

ざっくりいうと、

 データ全体で、基準値を統一する

ことです。

 Webで規格化を調べると、「商品の部品を規格化」というようなフレーズが多く出てきますが、これも意味としては同じです。即ち、部品の「形」や「品質」を統一することで、組み立て方法を一律にして生産性を上げたり、品質を一定に保ったりできるわけです。
 言い換えると、これから解説する正規化と標準化は規格化の一種ということになります。

正規化(Normalization)

ざっくりいうと、

 データ全体の最大値が1最小値が0になるようにする

ことです。 以下の式で表されます。

Ni  :正規化後の配列のi番目の値
Xi  :元の配列のi番目の値
xmax 元の配列の最大値
xmin :元の配列の最小値

正規化を行う目的はこれまたざっくりいうと

 データ全体の絶対値のばらつきをなくすため

です。

標準化 (Standardization)

ざっくりいうと、

 データ全体の平均値が0分散が1になるようにする

ことです。以下の式で表されます。

Si:標準化後の配列のi番目の値
Xi:元の配列のi番目の値
μ :元の配列の平均
σ :元の配列の標準偏差

標準化を行う目的はこれまたざっくりいうと

 データ全体の平均値と分散のばらつきをなくすため

です。

正規化・標準化の使いどころ

 正規化・標準化の意味と目的を学んできましたが、ではどういう時に使うのでしょうか。
それは、機械学習に使うデータの特徴量(例:重さ、値段等。殆どの場合、列=特徴量となる)の絶対値や分散のばらつきが大きい時です。
 例えば、1~10の値を取る特徴量Aと100~1000の値を取る特徴量Bを入力データとして機械学習を行うとします。特徴量Aと特徴量Bの絶対値は平均すると100倍程度の差がありますが、このデータをそのまま使うとこの差が、機械学習における特徴量の「価値」の差として反映されてしまう場合があります。(アルゴリズムの種類によりますが)つまり、正しくは特徴量AとB、両方の傾向を学習しなければならないところを、ほぼ特徴量Bの傾向のみ学習してしまい、正しい学習が行われない、ということが起こります。
 別の例として、 1~10の値を取る特徴量Aと5~6の値を取る特徴量Bを入力データとして機械学習を行うとします。 この場合、平均値に大きな差はありませんが、分散に10倍近い差があり、やはり、機械学習の制度を下げる要因となってしまいます。

Pythonで正規化、標準化の例

 Pythonで正規化、標準化を行う場合はScikit-learnAPIを使用します。 詳細は以下をご覧ください。

正規化(MinMaxScaler):
https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.MinMaxScaler.html?highlight=minmaxscaler#sklearn.preprocessing.MinMaxScaler
normalizerというAPIは別物なので注意

標準化(StandardScaler):
https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.StandardScaler.html

以下が、ソースコードの例です。ここで使っているdfpandasDataFrameです。
csvファイルからDataFrameを作成する場合は以下をご覧ください。
https://tedukapm.tech/?p=12
transformを行った後はarrayに変換されていることに注意しましょう。

#正規化
from sklearn.preprocessing import MinMaxScaler
mscaler =  MinMaxScaler()
mscaler.fit(df)
nr = mscaler.transform(df)
#標準化
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(df)
sc = scaler.transform(df)

まとめ

 正規化と標準化の計算式と使う目的、Pythonでの使い方を解説しました。ちなみに、似たような名前の正則化という処理もありますがこれはちょっと別物ですので、またの機会に解説したいと思います。

affiliate Amazon ASP.NET ASP.NET.Core CheatSheet ConoHaWING DataFrame Excel FX GogoJungle Google AdSense matplotlib MQL5 MT5 Pandas Permalink plugin scikit-learn VBA WordPress エラー サーバー サービス ドメイン フォーム 前処理 機械学習 統計