機械学習に使うデータには複数の特徴量が含まれます。そして、それらの値の範囲は大きく異なっていることもあります。例えば、身長はだいたい3桁の値、体重はだいたい2桁の値と、特徴量によってスケールはばらばらです。
このようなデータをそのまま線形回帰などに用いると、上手く学習できない可能性があります。そこで、データのスケールを事前に揃える前処理がよく行われます。
これにはいくつか方法があるのですが、ここでは一般的によく使われる「正規化」と「標準化」という二つを説明します。
データの特徴を確認しよう
今回は「機械学習の入り口「線形回帰」の実装を Python × NumPy で体験」でも使用している30人の身長と体重を使用します。NumPy配列で定義し、グラフで表示してみます。
身長は約130~190、体重は30~90と、データ間で桁が違うことがわかります。このまま線形回帰などを学習すると、上手くいかない可能性があるのです。
では、値の範囲を揃えるスケーリングの方法を見ていきましょう。
①正規化に挑戦
特徴量スケーリングの一つ、「正規化」について説明します。
厳密には正規化には複数種類あるのですが、ここでは最も代表的な「データの値の範囲を0~1に揃える」正規化を行います。
具体的な方法は、データをX、データの最大値をX_man、最小値をX_min、正規化したデータをX’とすると、次の式で表されます。
ではさっそくXとYを正規化してみましょう。
関数「norm」(正規化の意味であるnormalizationの略)として正規化処理を実装し、さらに正規化したデータをグラフで表示してみます。
XもYも、値の範囲が0~1になっていることがわかります。
②標準化に挑戦
次に、もう一つの代表的な手法である「標準化」について説明します。
データの範囲を0~1に揃える正規化に対して、標準化は「データの平均を0、分散を1に揃える」ことです。
標準化の方法は、データをX、データの平均をX_m、データの標準偏差をX_s、標準化したデータをX’とすると次の式で表されます。
では、XとYを標準化してみましょう。
関数「stand」(標準化の意味であるstandardizationの略)として標準化処理を実装し、さらに標準化したデータをグラフで表示してみます。
XとYの範囲は-2~2くらいになりました。一応標準化した後の平均と分散を表示してみましたが、確かにどちらもほぼ0と1になっていることがわかります。
元のスケールに戻す
ここまで、データを正規化、あるいは標準化する方法を説明しました。機械学習では、このようにスケーリングしたデータを使って学習することになります。
線形回帰を始めとした機械学習のゴールは、学習で得られたパラメータを用いて未知のデータに対する予測を行うことでした。この予測したい未知のデータに対してもスケーリングする必要があるのですが、この際、訓練データに対して計算した最大値と最小値、あるいは平均と標準偏差を使って正規化や標準化を行います。
さらに、こうして得られた予測値もスケーリングされた値になります。そのため、実際に出力する際には元のスケールに戻す必要があります。
ここからは、正規化と標準化のそれぞれについて、元のスケールに戻す方法を説明します。
①正規化された値を元のスケールに戻す
まずは正規化です。といっても、正規化の式を次のように変形するだけです。
X_max、X_minは、訓練データに対して計算したものを使用します。
②標準化された値を元のスケールに戻す
次に標準化です。こちらも、標準化の式を変形するだけです。
正規化の時と同様に、X_m、X_sは、訓練データに対して計算したものを使用します。
まとめ
今回はデータの前処理として、正規化と標準化の二つを学びました。データ同士の値の範囲に偏りがある場合、学習する前にこのような処理を行うことで学習が上手く行えます。
ただし、データに大きな外れ値がある場合は正規化は適さないなど、場面によって使い分ける必要もあります。また、白色化など、これ以外のスケーリング手法もありますので、余力がある方は調べてみてください。