St_Hakky’s blog

Data Science / Human Resources / Web Applicationについて書きます

【Python】数量データの正規化 ( 標準化 ) について

こんにちは。

今回はデータの正規化についてです。

いろんな文脈で様々な意味で使われている「正規化」っていう言葉ですが、今回は統計や機械学習で扱う数量のデータに対して行うことに絞り、まとめていきたいと思います。

Introduction

データの正規化とは

こちらの記事を読んでいたところ、Wikipediaを引用されていたので、Wikipediaの正規化のページも合わせてみることにしました。

すると、正規化とは

データ等々を一定のルール(規則)に基づいて変形し、利用しやすくすること。別の言い方をするならば、正規形でないものを正規形(比較・演算などの操作のために望ましい性質を持った一定の形)に変形することをいう。

だそうです。いちばん有名なのは後でも紹介するz-scoreだと思いますが、それでイメージしちゃえばわかりやすいかなと。文章の正規化とかもありますね。

つまり、「データを一定の方法で変形し、例えば身長と体重みたいな次元が違うものに対しても、なんとかして同じような単位で取り扱えるようにして、計算や比較しやすくしよう」、というのが正規化の狙いと言えます。

データの正規化手法

ここからは様々なデータの正規化手法についてまとめていきたいと思います。

まとめる際には、

  • 目的
  • 条件
  • 定義
  • 実装
  • 所感

の順番で紹介していきたいと思います。

z-score normalization (標準化)

標準化と言い換えられることも多い、z-scoreです。

これは、元データを平均0、標準偏差が1のものに変換する正規化法のことをさします。

■目的
  • 元データを平均0、標準偏差が1のものに変換する正規化法
  • 外れ値のあるデータに対して有効
  • 最大値・最小値に上限、下限がない場合は、z-scoreを使うとよい
■条件
  • データの分布形状がガウス分布になっていること
■定義

z-scoreの定義は以下の通り。

$$
x_{z-score}^{i} = \frac{x^i - \mu}{\sigma}
$$

$\mu$ と $\sigma$ はそれぞれ平均と標準偏差になります。

■実装

これは、Numpy / Scipy / Scikit-learnの3つのパッケージで実装されています。

ぶっちゃけそんなにたいしたことをしていないので、numpyの配列を以下の関数にぶちこめば一応計算はできます。

def zscore(x):
    xmean = x.mean()
    xstd  = np.std(x)

    zscore = (x-xmean)/xstd
    return zscore
■所感

正規分布に従っているデータは結構多いので、これが一番使われている印象だし、普通に使うことが多いです。何でもかんでもぶち込むのはあれだけど…。

Min-Max normalization

■目的
  • 最小値を0、最大値を1とする正規化
■条件
  • 最大値と最小値が予め決まっている様な場合には有効な手法
  • データとして外れ値が存在していないこと(これがあると、とんでもない最大値や最小値にひっぱられてしまうため、うまく正規化できない)
  • データの分布が一様分布であること
■定義

$$
x_{min-max}^{i} = \frac{ x^i - min }{ max - min }
$$

■実装

これも実装はめちゃめちゃ簡単で、以下のような感じで書けます。

def min_max_normalization(x):
    x_min = x.min()
    x_max = x.max()
    x_norm = (x - x_min) / ( x_max - x_min)
    return x_norm
■所感

もともと母集団レベルで最大値と最小値の範囲が決まっているときなどはmin-maxを扱う方が計算しやすいです。ただ、データが一様に分布していないと、結構この正規化だとずれが出てくるので、簡単だけど使いどころが難しいなぁと。

参考

z-scoreによる正規化とmin-max normalizationの違いについて

これについては以下の記事で説明されています。基本的には、上であげたとおり、データに仮定を置く分布形状が違うという点が異なっています。

正規化を行う際には、解析者が正規化を行う前に、各次元の特徴量がどのような分布形状になっているかを確認し、その上で仮定をおいて使うべきです。

正規化による効果

正規化を行ったことによる効果について、ロジスティック回帰を用いて検証している例がありました。

この例は、もうちょっと次元毎に分布とかを変えたら結果が変わるのかなと思いましたがどうなんでしょうか…そのうちやるかもしれません…。

Numpy / Scipy / Scikit-learnによる実装

別に自分で関数を作っても問題ないレベルの内容ですが、Numpyなどで実装されています。以下でそれぞれの内容についてみることができます。