Python/sklearnで学習データの前処理!標準化と正規化

  • このエントリーをはてなブックマークに追加

機械学習を使って学習や予測を行う際は、データの前処理は欠かすことのできないプロセスです。ここではデータの標準化と正規化の概要と必要性、Pythonとscikit-learnによるコーディング例を紹介します。

こんにちは。wat(@watlablog)です。
機械学習に使うデータは何でも良いわけではありません!ここではPython/scikit-learnによるデータの標準化と正規化を紹介します

入力データの標準化と正規化の概要

標準化とは?

標準化Standardization)とは、「平均を0に、標準偏差を1にするスケーリング」です。

世間では様々な意味合いで「標準化」という言葉が使われていますが、数学的な定義はこちらになります。

データセット\(x(i)\)を標準化したデータセット\(x_{std}(i)\)に変換する方法は、平均\(\bar{x}\)と標準偏差\(\sigma_{x}\)を用いて式(1)で行います。

\[x_{std}(i)=\frac{x(i)-\bar{x}}{\sigma_{x} } (1)\]

正規化とは?

正規化Normalization)とは、「データを一定の規則に従って加工し、扱いやすくすること」です。

正規化はデータの種類によって様々な方法がありますが、特に機械学習の分野で使われる正規化には、データの値をある範囲内に収めるスケーリングが頻繁に使われます。

数あるスケーリングの中でも、データの最小値\(x_{min}\)と最大値\(x_{max}\)を使って0から1の値に変換する手法をMin-Maxスケーリングと呼びます。

Min-Maxスケーリングで正規化した値\(x_{norm}(i)\)を得るには式(2)を使います。

\[x_{norm}(i)=\frac{x(i)-x_{min}}{x_{max}-x_{min}} (2)\]

この方法は簡便であるため理解がしやすいですが、外れ値の影響を受けやすいという欠点を忘れてはいけません

機械学習ではデータスケールが揃っていないと精度が落ちる

データの前処理はなぜ必要か?

機械学習ではトレーニングに使用するデータの質がその後の分類や予測問題の精度を決めます。

例えば人間の身長や体重の統計データをトレーニングに使う場合、あるデータはcmやg、またあるデータはmやkgを用いていたとします。

この時、データの単位を揃えないで計算をしてしまうことは誰が考えてもダメであることは明白ですが、身長や体重等異なる単位系のデータを扱う場合は「尺度」を揃えるということをしないと各パラメータの影響度を評価することはできません。

尺度というのは長さを測る時に使う言葉でもありますが、広義には「物事を評価する基準」という意味も持ちます。

例えば子どもと大人を分類する機械学習をする場合に身長をm、体重をkgで表していたとすると、身長よりも体重の方が数値自体の大きさは大きくなります。
コンピュータは僕達のような常識を持っていないので、同じ尺度にするためにスケーリングを行って評価した方がアルゴリズムがうまく働きます。

学習の効果を最大限に引き出すためにデータの前処理を検討しましょう

機械にやさしいデータを前処理で作ってあげましょう!

scikit-learnによる標準化と正規化のコード

標準化のサンプルコード

早速Pythonのscikit-learnを使ったコードを書いていきます。まずは全コードを以下に示します。

標準化に必要なライブラリは「from sklearn.preprocessing import StandardScaler」としてimportします。

用意するデータは「Python機械学習!scikit-learnによる単回帰分析」で用意したノイズを含んだ自作のデータセットです。

標準化をしている部分は「sc = StandardScaler()」で標準化のモジュールを呼び出し、「std = sc.fit_transform(data)」でデータセットの統計的な指標を計算(fit)し、その値(平均や標準偏差)を使ってデータセットを変換(transform)しているというたった2行の部分になります。

途中、print()文で元のデータの平均と標準偏差、標準化後のデータの平均と標準偏差を表示させていますが、本コードを実行すると以下のような結果を得ます。

想定通り、変換後の平均がほぼ0(完全に0になっていないのは数値誤差と考えられる)、標準偏差が1になっていることが確認できました。

元のデータセット(Dataset)と標準化後のデータセット(Standardized)をmatplotlibを使ってグラフにプロットすると以下の図が得られます。

変換後は0付近に分布していますね。

標準化の結果

正規化のサンプルコード

続いてMinMaxスケーリングによる正規化コードを書いていきます。
今回は「from sklearn.preprocessing import MinMaxScaler」とMinMaxスケーリングのライブラリをimportしています。

標準化の時と書き方は同じで「mms = MinMaxScaler()」でMinMaxスケーリングのモジュールを呼び出し、「norm = mms.fit_transform(data)」で実際にfitとtransformを同時に実行します。

上記コードを実行すると以下の結果を得ます。コンソールに表示された数値から、正規化後は最大値が1, 最小値が0のデータになっていることが確認できました。

グラフに元データセットとMinMaxスケーリングによる正規化後データセットをプロットすると以下の図を得ます。

正規化の結果

まとめ

本記事では機械学習プログラムの入力データには前処理が重要であることを説明し、標準化と正規化の例を紹介しました。

また、機械学習でよく使われるPythonのscikit-learnというライブラリを使った標準化と正規化のプログラミング例を紹介し、グラフプロットとprint文による結果の確認までを行いました。

実際には勾配降下法を使う場合、画像データを使う場合、活性化関数の種類…等によってこれらの標準化と正規化を使い分けるとのことですが、学習を進めて行くなかでそれらの問題に直面した時に再度記事にして紹介したいと思います。

「データの前処理」は地味ながら最も大事なことで、意外とかなりの時間を使って作業することと推定します!
Twitterでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!

SNSでもご購読できます。

コメント

コメントを残す

*