01.3.4 高校生向け
MinMaxScaler で区間正規化する(高校生向け)
こんな場面を想像してみよう #
体力テストで、50 m 走(秒)とハンドボール投げ(m)の記録から「似た体力の人」を探したいとします。A さんと B さんの 2 人の記録を見てみましょう。
| 50 m 走 | ハンドボール投げ | |
|---|---|---|
| A さん | 7.2 秒 | 25 m |
| B さん | 9.0 秒 | 27 m |
2 人のちがいは、走りで 1.8、投げで 2。数字の大きさだけ見ると「同じくらいちがう」ように見えます。でも 50 m 走でクラスの記録が 7〜9 秒に収まるなら、1.8 秒差は最速と最遅の差です。一方、ハンドボール投げの記録が 15〜35 m にちらばっているなら、2 m の差はほとんど誤差です。
つまり「数字の差」を単位のまま比べると、目盛りの粗い項目が勝手に重く数えられてしまうのです。そこで、すべての項目を「最小 0・最大 1」の同じものさしに移してから比べます。

左は変換前。特徴量 1 は 20 のあたりに細く、特徴量 2 は 100 のあたりに幅広く立っていて、横軸の別々の場所にいます。右は変換後(この例では −1〜1 に移しています)。2 つの山が同じ範囲にぴったり重なり、横軸の目盛りが「最小が −1、最大が 1」に変わっただけで、山の形は左右で同じです。
仕組み:ものさしを作り直す #
まず、最小値と最大値を見つけます。ヒストグラムでいえば、山の左端 \(x_{\min}\) と右端 \(x_{\max}\) に印をつける作業です。次に、全部の値から \(x_{\min}\) を引きます。山がまるごと左へ平行移動して左端が 0 に来ますが、形は変わりません。続けて、右端までの長さ \(x_{\max} - x_{\min}\) で割ります。山が横に伸び縮みして右端がちょうど 1 に来て、ここでも山の高さの並びは変わりません。最後に、ほかの項目にも同じことをします。それぞれの項目が自分の最小・最大で 0〜1 に移るので、すべての山が同じ範囲に並びます。
式にまとめると次の一次式です。
$$ x' = \frac{x - x_{\min}}{x_{\max} - x_{\min}} $$50 m 走 4 人分の記録で、この式をそのまま計算してみます。
| |
動かして見てみよう #
下の図で「再生」を押すと、説明した手順が 1 つずつ進みます。手順ごとの説明は図の下に出ます。
気をつけたいこと #
最初の弱点は外れ値です。ハンドボール投げで 1 人だけ 60 m 投げる人がいると、その人が 1 になり、残り全員が 0〜0.4 くらいに押し込まれます。ヒストグラムでいえば山が左端に寄ってつぶれた形で、外れ値がある場合は RobustScaler を考えます。二つ目は「0〜1 にしたから正規分布になる」という誤解です。形は変わらないので、ヒストグラムのゆがんだ山はゆがんだまま。平均 0・標準偏差 1 にそろえたいなら StandardScaler です。
やってみよう #
最初の課題は、自分のクラスの体力テストの 2 種目を選び、それぞれ最小・最大を調べて、自分の記録を 0〜1 に換算することです。どちらの種目が「クラス内では上位」か、換算前と印象が変わるか確かめましょう。二つ目は、身の回りで「単位がちがうのに足し合わせている例」を探すことです(例:総合評価の点数、ゲームの総合力)。どんなものさし(0〜1、100 点満点など)に直してから足しているか考えてみてください。三つ目は紙の実験です。「10 人の記録に 1 人だけ極端な値を入れる」状況を作り、0〜1 に換算したあとで残り 9 人の値がどの範囲に集まるか確かめると、外れ値に弱い理由が見えてきます。
つぎに読む #
数式の一般形(0〜1 以外の区間への変換)と scikit-learn の使い方は 標準版の MinMaxScaler で扱っています。平均 0・標準偏差 1 にそろえる兄弟分は StandardScaler(高校生向け)、外れ値に強い方法は RobustScaler(高校生向け) へ進んでください。「単位をそろえないと距離がゆがむ」実例は k 近傍法(高校生向け) で確かめられます。