01.3.4 中学生向け
MinMaxScaler で区間正規化する(中学生向け)
クイズ:握力と 50 m 走、どっちが「すごい」? #
体力テストの結果を見て、A さんと B さんのどちらが運動が得意か考えます。
| 握力 | 50 m 走 | |
|---|---|---|
| A さん | 38 kg | 8.4 秒 |
| B さん | 30 kg | 7.3 秒 |
| クラスの最小 | 22 kg | 7.0 秒 |
| クラスの最大 | 42 kg | 9.5 秒 |
「38 と 8.4 を足す」わけにはいきません。kg と秒では単位がちがうからです。そこで「クラスの中で、下から何割のところにいるか」に読みかえてみます。A さんの握力は最小 22 と最大 42 の間で、上から 2 割くらいの位置。50 m 走は真ん中より少し遅いくらい。こうすると、2 つの種目を同じ「0 から 1 のものさし」で比べられます。これが MinMaxScaler のやっていることです。

上の図の左側は、変える前の 2 種類の数です。片方は 20 の近くに集まり、もう片方は 100 の近くに広く散らばっています。右側が MinMaxScaler で変えたあとで、2 つの山が同じ範囲(この図では −1 から 1)にぴったり重なっています。山の形は変わらず、置かれる場所と幅だけが −1 から 1 にそろったことに注目してください。
仕組み:ものさしを読みかえる #
まず、いちばん小さい値と大きい値(最小と最大)を見つけます。握力なら 22 kg と 42 kg で、図では左の山の左はしと右はしを探すことに当たります。次に、いちばん小さい値を 0 に、いちばん大きい値を 1 にします。山の左はしを 0 の位置に、右はしを 1 の位置に持ってくるわけです。続けて、間の値は「どのくらいの位置にいるか」で決めます。A さんの握力 38 は、22 から 42 までの道のりの 8 割のところなので 0.8 になり、間の値はみんなこの「道のりの割合」で決まります。最後に、全部の種目で同じことをします。すると図の右側のように、どの山も 0 から 1 の同じ範囲に収まり、比べたり足し合わせたりできるようになります。
動かして見てみよう #
下の図で「再生」を押すと、説明した手順が 1 つずつ進みます。手順ごとの説明は図の下に出ます。
気をつけたいこと #
最初の注意は、極端な 1 人にふり回されることです。クラスに握力 90 kg の人が 1 人いると、その人が 1 を取り、ほかの全員は 0.1 から 0.25 くらいにぎゅっと押しこまれます。差が見えにくくなるので、そんなときは別のそろえ方(RobustScaler など)を考えます。二つ目は、「向き」はそろわないことです。50 m 走は小さいほどよいので、0 から 1 にしただけでは「1 がいちばん速い」にはならず、向きをそろえるのは別の仕事です。三つ目は、ものさしは最初に決めた「最小 22 kg・最大 42 kg」を使い続けることです。あとから加わった人が最大を超えても、ものさしを作り直さず同じ基準で測るのがルールで、1 を超える値が出ることもあります。
やってみよう #
最初の課題は、自分のクラスの体力テスト(または好きな種目の記録)を 2 つ選び、最小を 0、最大を 1 として、自分の値がどこにくるか計算することです。二つ目は、身の回りで「単位がちがって比べにくいペア」を 3 つ探すことです(例:テストの点と提出物の回数、身長と体重)。三つ目は、上の表に「握力 90 kg の転校生」を加えて、全員の値を計算し直すことです。元の値がどう変わるかを見て、何が困るか説明してみましょう。
つぎに読む #
式と Python のプログラムまで含めた本編は MinMaxScaler(標準版) です。極端な 1 人にふり回されないそろえ方は 中学生向けの RobustScaler で紹介しています。数を「低・中・高」のようなグループに区切る方法は 中学生向けのビニング にあります。